summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:53 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:53 +0000
commitd7d99c8433b3bd35c8bad352ebd1fc49cff45264 (patch)
tree83c0e24403636a9a639ebf5c2fcd4e3b7efecef7
R6.6 is the Xorg base-lineXORG-MAIN
-rw-r--r--Xmark635
-rw-r--r--bitmaps.c878
-rw-r--r--bitmaps.h31
-rw-r--r--do_arcs.c555
-rw-r--r--do_blt.c594
-rw-r--r--do_complex.c201
-rw-r--r--do_dots.c70
-rw-r--r--do_lines.c320
-rw-r--r--do_movewin.c219
-rw-r--r--do_rects.c127
-rw-r--r--do_segs.c402
-rw-r--r--do_simple.c116
-rw-r--r--do_tests.c1297
-rw-r--r--do_text.c411
-rw-r--r--do_traps.c111
-rw-r--r--do_tris.c239
-rw-r--r--do_valgc.c81
-rw-r--r--do_windows.c289
-rw-r--r--fillblnk15
-rw-r--r--perfboth40
-rw-r--r--perfratio40
-rw-r--r--x11pcomp.cpp100
-rw-r--r--x11perf.c1451
-rw-r--r--x11perf.h173
-rw-r--r--x11perf.man1015
-rw-r--r--x11perfcomp.man79
26 files changed, 9489 insertions, 0 deletions
diff --git a/Xmark b/Xmark
new file mode 100644
index 0000000..43e8228
--- /dev/null
+++ b/Xmark
@@ -0,0 +1,635 @@
+#! /bin/sh
+#$Xorg: Xmark.sh,v 1.3 2000/08/17 19:54:08 cpqbld Exp $
+#XPC Header: Xmark,v 1.15 93/04/12 10:10:07 hmgr Exp
+#
+############################################################
+# Xmark version XPC Revision: 1.15
+#
+# Usage: Xmark datafile
+#
+############################################################
+# CHANGE HISTORY:
+#
+# X11perfcompDR -- Creates a Digital Review compatible breakdown of
+# x11perf v1.2 results as described in "Take Your Pick Of Graphics"
+# by John Montgomery, Digital Review, May 7th, 1990, Page 44.
+# 8/30/90 v1.0 program created by Lonnie Mandigo
+# 1/18/91 Modification by Lonnie Mandigo
+# Fixed a bug to include UCIRC in data.
+# 2/5/91 Modification by Lonnie Mandigo
+# Now removes sum.tmp file when finished.
+# 3/18/91 v1.01 Increased resolution to handle zero ratios.
+# Minor aesethic cleanups and better error handling.
+# Lonnie Mandigo and Jason Levitt (jason@cs.utexas.edu)
+# 3/4/93 Converted to Xmark by Bob Kuseski
+# to produce a single number representing the ratio between
+# the xpc weighted averages of the output from x11perf Rev 1.3
+# for the server under test and a SparcStation 1
+# 3/10/93 Changed to produce THREE output numbers and added bounds
+# checking of input data.
+# 3/15/93 Removed usage of '-F' in grep for compatibility reasons
+# 3/16/93 Corrected usage of substr() and used two greps versus fgrep
+# 4/12/93 Eliminated use of functions and \n in echo
+#
+############################################################
+# Copyright (c) 1993 by Hewlett-Packard Company
+#
+# 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 the copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Hewlett-Packard not be
+# used in advertising or publicity pertaining to distribution of the
+# software without specific, written prior permission.
+#
+############################################################
+# Instructions:
+#
+# Usage: Xmark datafile
+#
+# where: 'datafile' is created by running x11perf Rev 1.3
+# with the flags below:
+#
+# x11perf -display mysystem:0.0 -v1.3 -rop GXcopy GXxor -all > datafile
+# or
+# x11perf -display mysystem:0.0 -v1.3 -rop GXcopy -all > datafile
+# x11perf -display mysystem:0.0 -v1.3 -rop GXxor -all >> datafile
+# or
+# x11perf -display mysystem:0.0 -v1.3 -rop GXxor -all > datafile
+# x11perf -display mysystem:0.0 -v1.3 -rop GXcopy -all >> datafile
+#
+# Xmark summarizes the results relative to the data contained in
+# the datafile. Xmark writes to standard out, so if you want to
+# capture the output in a file, use:
+#
+# Xmark datafile > output.comp
+#
+# The 'output.comp' contains THREE numbers:
+# - Weighted x11perf number of the server under test
+# - Weighted x11perf number of the SparcStation 1
+# - Xmark = the ratio of the above two numbers
+#
+# Note the SparcStation 1 number comes from a:
+# X11R5 Xsun
+# Standard with SunOS 4.1.2
+# SunOs 4.1.2
+# CG3 dumb Color Frame Buffer
+#
+############################################################
+############################################################
+
+# Cleanup on interrupt
+trap \
+"echo Interrupt: removing temporary files. >& 2 ;rm -f temp.$$ rates.$$ awkfile.$$; exit 1" 1 2 3 9 15
+
+# Must have only one file specified
+if [ "$#" -ne 1 ]
+then
+ echo "Usage: $0 datafile" >& 2
+ exit 1
+fi
+
+# Must be an ordinary file
+if [ ! -f "$1" ]
+then
+ echo "Error: data file does not exist or is not ordinary." >& 2
+ exit 1
+fi
+
+# See if the date file has the correct number of results.
+LC1=`grep trep "$1" | wc -l`
+LC2=441 # Number of test without Shared Memory Transport
+LC3=447 # Number of test with Shared Memory Transport
+
+if [ "$LC1" -ne "$LC2" ] && [ "$LC1" -ne "$LC3" ]
+then
+ echo "WARNING: datafile contains $LC1, not "$LC2" or "$LC3" 'trep' results;" >& 2
+ if [ "$LC1" -gt "$LC2" ]
+ then
+ echo "extra results are probably OK." >& 2
+ echo ""
+ fi
+fi
+
+DATA=$1
+
+grep trep $DATA > temp.$$
+grep server $DATA >> temp.$$
+
+# convert the averages to standard form.
+
+cat > awkfile.$$ <<'EOS'
+ BEGIN {
+ weight["10x10 rectangle"] = 37;
+ weight["Scroll 500x500 pixels"] = 33;
+ weight["100x100 rectangle"] = 32;
+ weight["10-pixel line segment"] = 31;
+ weight["10-pixel line"] = 30;
+ weight["PutImage 100x100 square"] = 30;
+ weight["Scroll 100x100 pixels"] = 29;
+ weight["PutImage 500x500 square"] = 29;
+ weight["500x500 rectangle"] = 29;
+ weight["100-pixel line"] = 28;
+ weight["Char in 60-char line (9x15)"] = 28;
+ weight["Char in 80-char image line (6x13)"] = 28;
+ weight["Char in 80-char line (6x13)"] = 27;
+ weight["Char in 80-char image line (TR 10)"] = 27;
+ weight["100-pixel line segment"] = 27;
+ weight["Char in 80-char line (TR 10)"] = 27;
+ weight["Char in 60-char image line (9x15)"] = 26;
+ weight["Copy 100x100 from pixmap to window"] = 26;
+ weight["Copy 500x500 from pixmap to window"] = 26;
+ weight["Char in 70-char line (8x13)"] = 24;
+ weight["500-pixel line"] = 24;
+ weight["Char in 20/40/20 line (6x13, TR 10)"] = 23;
+ weight["Char in 70-char image line (8x13)"] = 23;
+ weight["Change graphics context"] = 23;
+ weight["Copy 100x100 from window to window"] = 23;
+ weight["10-pixel horizontal line segment"] = 23;
+ weight["10-pixel vertical line segment"] = 23;
+ weight["Copy 500x500 from window to window"] = 22;
+ weight["Char in 30-char line (TR 24)"] = 22;
+ weight["Char16 in 40-char line (k14)"] = 22;
+ weight["500-pixel line segment"] = 22;
+ weight["Char in 30-char image line (TR 24)"] = 22;
+ weight["100-pixel horizontal line segment"] = 22;
+ weight["100-pixel vertical line segment"] = 22;
+ weight["Scroll 10x10 pixels"] = 21;
+ weight["Char16 in 40-char image line (k14)"] = 21;
+ weight["GetImage 500x500 square"] = 21;
+ weight["PutImage 10x10 square"] = 20;
+ weight["GetImage 100x100 square"] = 20;
+ weight["Move window (4 kids)"] = 20;
+ weight["Copy 10x10 from pixmap to window"] = 20;
+ weight["100x100 4x4 tiled rectangle"] = 20;
+ weight["Copy 100x100 from window to pixmap"] = 19;
+ weight["Hide/expose window via popup (4 kids)"] = 19;
+ weight["Copy 500x500 from window to pixmap"] = 19;
+ weight["500-pixel horizontal line segment"] = 19;
+ weight["500-pixel vertical line segment"] = 19;
+ weight["Fill 10x10 equivalent triangle"] = 19;
+ weight["Char16 in 23-char line (k24)"] = 19;
+ weight["1x1 rectangle"] = 19;
+ weight["Char16 in 7/14/7 line (k14, k24)"] = 18;
+ weight["10x10 4x4 tiled rectangle"] = 18;
+ weight["100-pixel line segment (1 kid)"] = 18;
+ weight["100x100 rectangle outline"] = 18;
+ weight["Move window via parent (4 kids)"] = 18;
+ weight["GetAtomName"] = 18;
+ weight["GetProperty"] = 18;
+ weight["Char16 in 23-char image line (k24)"] = 18;
+ weight["100-pixel line segment (3 kids)"] = 17;
+ weight["Resize window (4 kids)"] = 17;
+ weight["Map window via parent (4 kids)"] = 17;
+ weight["Copy 100x100 from pixmap to pixmap"] = 17;
+ weight["Unmap window via parent (4 kids)"] = 17;
+ weight["100-pixel line segment (2 kids)"] = 17;
+ weight["10-pixel solid circle"] = 17;
+ weight["1-pixel line"] = 17;
+ weight["Move window (16 kids)"] = 16;
+ weight["Fill 100x100 equivalent triangle"] = 16;
+ weight["Hide/expose window via popup (16 kids)"] = 16;
+ weight["Move window via parent (16 kids)"] = 16;
+ weight["10x10 rectangle outline"] = 16;
+ weight["Destroy window via parent (4 kids)"] = 16;
+ weight["Create unmapped window (4 kids)"] = 16;
+ weight["Copy 10x10 from window to window"] = 16;
+ weight["Copy 100x100 1-bit deep plane"] = 16;
+ weight["10-pixel circle"] = 16;
+ weight["100x100 opaque stippled rectangle"] = 16;
+ weight["500x500 4x4 tiled rectangle"] = 16;
+ weight["100x100 stippled rectangle"] = 16;
+ weight["Copy 500x500 from pixmap to pixmap"] = 16;
+ weight["Create and map subwindows (16 kids)"] = 16;
+ weight["10x10 stippled rectangle"] = 16;
+ weight["Resize window (16 kids)"] = 16;
+ weight["Map window via parent (16 kids)"] = 15;
+ weight["100-pixel solid circle"] = 15;
+ weight["Copy 500x500 1-bit deep plane"] = 15;
+ weight["500x500 rectangle outline"] = 15;
+ weight["Create and map subwindows (4 kids)"] = 15;
+ weight["Destroy window via parent (16 kids)"] = 15;
+ weight["10x1 wide horizontal line segment"] = 15;
+ weight["10x1 wide vertical line segment"] = 15;
+ weight["100x100 161x145 tiled rectangle"] = 15;
+ weight["1-pixel line segment"] = 15;
+ weight["Unmap window via parent (16 kids)"] = 15;
+ weight["Fill 100x100 trapezoid"] = 14;
+ weight["100-pixel circle"] = 14;
+ weight["10x10 opaque stippled rectangle"] = 14;
+ weight["100-pixel dashed line"] = 14;
+ weight["500x500 161x145 tiled rectangle"] = 14;
+ weight["Copy 10x10 from window to pixmap"] = 14;
+ weight["100x10 wide horizontal line segment"] = 14;
+ weight["100x10 wide vertical line segment"] = 14;
+ weight["100x100 wide rectangle outline"] = 14;
+ weight["100x100 216x208 tiled rectangle"] = 14;
+ weight["Dot"] = 14;
+ weight["10x10 161x145 tiled rectangle"] = 14;
+ weight["Fill 100x100 equivalent complex polygons"] = 14;
+ weight["Move window (50 kids)"] = 13;
+ weight["Move window via parent (50 kids)"] = 13;
+ weight["Circulate window (16 kids)"] = 13;
+ weight["100-pixel dashed segment"] = 13;
+ weight["Create and map subwindows (50 kids)"] = 13;
+ weight["Create and map subwindows (25 kids)"] = 13;
+ weight["10x10 wide rectangle outline"] = 13;
+ weight["500x500 216x208 tiled rectangle"] = 13;
+ weight["Hide/expose window via popup (25 kids)"] = 13;
+ weight["Create and map subwindows (100 kids)"] = 13;
+ weight["Map window via parent (50 kids)"] = 13;
+ weight["Fill 10x10 trapezoid"] = 13;
+ weight["100x10 wide line"] = 13;
+ weight["10x10 216x208 tiled rectangle"] = 13;
+ weight["10-pixel dashed line"] = 13;
+ weight["Map window via parent (100 kids)"] = 13;
+ weight["Copy 10x10 from pixmap to pixmap"] = 13;
+ weight["Map window via parent (25 kids)"] = 13;
+ weight["Create unmapped window (25 kids)"] = 13;
+ weight["Move window (25 kids)"] = 13;
+ weight["Circulate window (4 kids)"] = 12;
+ weight["Move window via parent (25 kids)"] = 12;
+ weight["Create unmapped window (16 kids)"] = 12;
+ weight["Create and map subwindows (75 kids)"] = 12;
+ weight["500x500 opaque stippled rectangle"] = 12;
+ weight["Hide/expose window via popup (100 kids)"] = 12;
+ weight["Create and map subwindows (200 kids)"] = 12;
+ weight["Hide/expose window via popup (50 kids)"] = 12;
+ weight["500x50 wide horizontal line segment"] = 12;
+ weight["500x50 wide vertical line segment"] = 12;
+ weight["100x100 161x145 opaque stippled rectangle"] = 12;
+ weight["Resize window (25 kids)"] = 12;
+ weight["Map window via parent (200 kids)"] = 12;
+ weight["10x10 161x145 opaque stippled rectangle"] = 12;
+ weight["X protocol NoOperation"] = 12;
+ weight["10-pixel dashed segment"] = 12;
+ weight["Resize unmapped window (16 kids)"] = 12;
+ weight["Create unmapped window (100 kids)"] = 12;
+ weight["Fill 10x10 equivalent complex polygon"] = 12;
+ weight["Map window via parent (75 kids)"] = 12;
+ weight["100x100 161x145 stippled rectangle"] = 12;
+ weight["Moved unmapped window (16 kids)"] = 12;
+ weight["Copy 10x10 1-bit deep plane"] = 12;
+ weight["Unmap window via parent (50 kids)"] = 12;
+ weight["GetImage 10x10 square"] = 12;
+ weight["Fill 100x100 tiled trapezoid"] = 12;
+ weight["500x500 wide rectangle outline"] = 12;
+ weight["Fill 100x100 stippled trapezoid"] = 12;
+ weight["500x500 stippled rectangle"] = 12;
+ weight["Moved unmapped window (4 kids)"] = 12;
+ weight["10x10 161x145 stippled rectangle"] = 12;
+ weight["Unmap window via parent (25 kids)"] = 12;
+ weight["500-pixel solid circle"] = 12;
+ weight["Create unmapped window (50 kids)"] = 12;
+ weight["Destroy window via parent (25 kids)"] = 11;
+ weight["Resize window (200 kids)"] = 11;
+ weight["100-pixel filled ellipse"] = 11;
+ weight["Hide/expose window via popup (200 kids)"] = 11;
+ weight["Unmap window via parent (100 kids)"] = 11;
+ weight["Circulate window (25 kids)"] = 11;
+ weight["Resize window (50 kids)"] = 11;
+ weight["Hide/expose window via popup (75 kids)"] = 11;
+ weight["Destroy window via parent (100 kids)"] = 11;
+ weight["Destroy window via parent (50 kids)"] = 11;
+ weight["Create unmapped window (200 kids)"] = 11;
+ weight["Fill 100x100 opaque stippled trapezoid"] = 11;
+ weight["Move window via parent (75 kids)"] = 11;
+ weight["500-pixel filled ellipse"] = 11;
+ weight["Resize unmapped window (4 kids)"] = 11;
+ weight["Move window via parent (200 kids)"] = 11;
+ weight["Move window (75 kids)"] = 11;
+ weight["Fill 10x10 tiled trapezoid"] = 11;
+ weight["Fill 100x100 161x145 stippled trapezoid"] = 11;
+ weight["Move window (200 kids)"] = 11;
+ weight["Fill 10x10 stippled trapezoid"] = 11;
+ weight["Create unmapped window (75 kids)"] = 11;
+ weight["100-pixel fill chord partial circle"] = 10;
+ weight["Circulate Unmapped window (16 kids)"] = 10;
+ weight["Circulate window (50 kids)"] = 10;
+ weight["Move window (100 kids)"] = 10;
+ weight["Circulate window (100 kids)"] = 10;
+ weight["Move window via parent (100 kids)"] = 10;
+ weight["500x50 wide line"] = 10;
+ weight["500-pixel circle"] = 10;
+ weight["100-pixel double-dashed line"] = 10;
+ weight["Unmap window via parent (200 kids)"] = 10;
+ weight["Moved unmapped window (50 kids)"] = 10;
+ weight["10-pixel filled ellipse"] = 10;
+ weight["Resize window (75 kids)"] = 10;
+ weight["Fill 100x100 161x145 tiled trapezoid"] = 10;
+ weight["500x500 161x145 opaque stippled rectangle"] = 10;
+ weight["Fill 100x100 161x145 opaque stippled trapezoid"] = 10;
+ weight["Unmap window via parent (75 kids)"] = 10;
+ weight["Resize unmapped window (25 kids)"] = 10;
+ weight["100-pixel ellipse"] = 10;
+ weight["Destroy window via parent (75 kids)"] = 10;
+ weight["Fill 1x1 equivalent triangle"] = 10;
+ weight["500-pixel ellipse"] = 10;
+ weight["Fill 10x10 opaque stippled trapezoid"] = 10;
+ weight["Resize window (100 kids)"] = 10;
+ weight["500x500 161x145 stippled rectangle"] = 10;
+ weight["Destroy window via parent (200 kids)"] = 10;
+ weight["100-pixel fill slice partial circle"] = 10;
+ weight["Fill 100x100 216x208 tiled trapezoid"] = 9;
+ weight["100-pixel wide circle"] = 9;
+ weight["Moved unmapped window (25 kids)"] = 9;
+ weight["10x1 wide line"] = 9;
+ weight["Resize unmapped window (100 kids)"] = 9;
+ weight["100-pixel double-dashed segment"] = 9;
+ weight["10-pixel fill chord partial circle"] = 9;
+ weight["Circulate window (75 kids)"] = 9;
+ weight["100-pixel partial circle"] = 9;
+ weight["Circulate window (200 kids)"] = 9;
+ weight["Fill 10x10 161x145 stippled trapezoid"] = 9;
+ weight["Circulate Unmapped window (4 kids)"] = 9;
+ weight["100-pixel dashed circle"] = 9;
+ weight["Circulate Unmapped window (25 kids)"] = 9;
+ weight["10-pixel ellipse"] = 9;
+ weight["Resize unmapped window (50 kids)"] = 9;
+ weight["100-pixel partial ellipse"] = 9;
+ weight["Fill 10x10 161x145 tiled trapezoid"] = 8;
+ weight["100x10 wide dashed line"] = 8;
+ weight["10-pixel partial circle"] = 8;
+ weight["100-pixel wide ellipse"] = 8;
+ weight["Fill 10x10 161x145 opaque stippled trapezoid"] = 8;
+ weight["100-pixel wide partial circle"] = 8;
+ weight["Moved unmapped window (75 kids)"] = 8;
+ weight["Resize unmapped window (75 kids)"] = 8;
+ weight["Circulate Unmapped window (100 kids)"] = 8;
+ weight["100-pixel fill slice partial ellipse"] = 8;
+ weight["100x10 wide double-dashed line"] = 8;
+ weight["10-pixel fill slice partial circle"] = 8;
+ weight["100-pixel dashed ellipse"] = 8;
+ weight["100-pixel fill chord partial ellipse"] = 8;
+ weight["100-pixel wide dashed circle"] = 8;
+ weight["100-pixel double-dashed circle"] = 8;
+ weight["Fill 10x10 216x208 tiled trapezoid"] = 7;
+ weight["Moved unmapped window (100 kids)"] = 7;
+ weight["10-pixel wide circle"] = 7;
+ weight["Moved unmapped window (200 kids)"] = 7;
+ weight["Resize unmapped window (200 kids)"] = 7;
+ weight["Circulate Unmapped window (50 kids)"] = 7;
+ weight["1-pixel circle"] = 7;
+ weight["10-pixel partial ellipse"] = 7;
+ weight["500-pixel wide circle"] = 7;
+ weight["500-pixel wide ellipse"] = 7;
+ weight["100-pixel wide partial ellipse"] = 7;
+ weight["Circulate Unmapped window (75 kids)"] = 7;
+ weight["100-pixel wide dashed ellipse"] = 7;
+ weight["100-pixel double-dashed ellipse"] = 7;
+ weight["10-pixel wide ellipse"] = 6;
+ weight["10-pixel wide partial circle"] = 6;
+ weight["1-pixel solid circle"] = 6;
+ weight["100-pixel wide double-dashed circle"] = 6;
+ weight["Circulate Unmapped window (200 kids)"] = 6;
+ weight["1x1 4x4 tiled rectangle"] = 6;
+ weight["10-pixel wide partial ellipse"] = 6;
+ weight["10-pixel fill chord partial ellipse"] = 6;
+ weight["10-pixel fill slice partial ellipse"] = 6;
+ weight["100-pixel wide double-dashed ellipse"] = 5;
+ weight["1x1 161x145 tiled rectangle"] = 5;
+ weight["1x1 216x208 tiled rectangle"] = 5;
+ weight["1x1 stippled rectangle"] = 5;
+ weight["1x1 opaque stippled rectangle"] = 4;
+ weight["1x1 161x145 opaque stippled rectangle"] = 4;
+ weight["1x1 161x145 stippled rectangle"] = 4;
+ weight["ShmPutImage 10x10 square"] = 0;
+ weight["ShmPutImage 100x100 square"] = 0;
+ weight["ShmPutImage 500x500 square"] = 0;
+ weight["(xor) 100-pixel line"] = 16;
+ weight["(xor) 10-pixel line segment"] = 14;
+ weight["(xor) 10-pixel line"] = 13;
+ weight["(xor) 100-pixel line segment"] = 13;
+ weight["(xor) 500-pixel line segment"] = 13;
+ weight["(xor) 500-pixel line"] = 12;
+ weight["(xor) 10x10 rectangle"] = 12;
+ weight["(xor) 100x100 rectangle"] = 12;
+ weight["(xor) 100-pixel vertical line segment"] = 10;
+ weight["(xor) 100x100 rectangle outline"] = 10;
+ weight["(xor) 100-pixel horizontal line segment"] = 10;
+ weight["(xor) 10-pixel vertical line segment"] = 10;
+ weight["(xor) 100-pixel line segment (2 kids)"] = 10;
+ weight["(xor) 10-pixel horizontal line segment"] = 10;
+ weight["(xor) 100-pixel line segment (1 kid)"] = 9;
+ weight["(xor) Char in 80-char line (6x13)"] = 9;
+ weight["(xor) 500-pixel vertical line segment"] = 9;
+ weight["(xor) Copy 100x100 from pixmap to window"] = 9;
+ weight["(xor) 10x10 rectangle outline"] = 9;
+ weight["(xor) 500-pixel horizontal line segment"] = 9;
+ weight["(xor) 100-pixel line segment (3 kids)"] = 9;
+ weight["(xor) PutImage 100x100 square"] = 9;
+ weight["(xor) 500x500 rectangle outline"] = 9;
+ weight["(xor) Char in 80-char line (TR 10)"] = 9;
+ weight["(xor) 500x500 rectangle"] = 9;
+ weight["(xor) Copy 500x500 from pixmap to window"] = 8;
+ weight["(xor) Char in 20/40/20 line (6x13, TR 10)"] = 8;
+ weight["(xor) 100-pixel dashed line"] = 8;
+ weight["(xor) Copy 100x100 1-bit deep plane"] = 8;
+ weight["(xor) Char in 60-char line (9x15)"] = 8;
+ weight["(xor) Char16 in 40-char line (k14)"] = 7;
+ weight["(xor) Fill 10x10 equivalent triangle"] = 7;
+ weight["(xor) PutImage 500x500 square"] = 7;
+ weight["(xor) Copy 100x100 from window to window"] = 7;
+ weight["(xor) 100-pixel dashed segment"] = 7;
+ weight["(xor) 100x100 wide rectangle outline"] = 6;
+ weight["(xor) Char16 in 7/14/7 line (k14, k24)"] = 6;
+ weight["(xor) Fill 100x100 trapezoid"] = 6;
+ weight["(xor) 100-pixel solid circle"] = 6;
+ weight["(xor) 10-pixel solid circle"] = 6;
+ weight["(xor) 1-pixel line segment"] = 6;
+ weight["(xor) 1-pixel line"] = 6;
+ weight["(xor) 10x1 wide horizontal line segment"] = 6;
+ weight["(xor) 10x1 wide vertical line segment"] = 6;
+ weight["(xor) Copy 100x100 from pixmap to pixmap"] = 6;
+ weight["(xor) 10-pixel dashed line"] = 6;
+ weight["(xor) Char in 30-char line (TR 24)"] = 6;
+ weight["(xor) Fill 100x100 equivalent triangle"] = 6;
+ weight["(xor) Copy 10x10 from pixmap to window"] = 6;
+ weight["(xor) Fill 10x10 trapezoid"] = 6;
+ weight["(xor) Char in 70-char line (8x13)"] = 6;
+ weight["(xor) 100-pixel circle"] = 6;
+ weight["(xor) Copy 100x100 from window to pixmap"] = 6;
+ weight["(xor) 10-pixel dashed segment"] = 5;
+ weight["(xor) 10-pixel circle"] = 5;
+ weight["(xor) 10x10 wide rectangle outline"] = 5;
+ weight["(xor) 100x100 stippled rectangle"] = 5;
+ weight["(xor) 100-pixel filled ellipse"] = 5;
+ weight["(xor) 10x10 4x4 tiled rectangle"] = 5;
+ weight["(xor) PutImage 10x10 square"] = 5;
+ weight["(xor) Copy 500x500 from window to window"] = 5;
+ weight["(xor) 500x500 wide rectangle outline"] = 5;
+ weight["(xor) 10x10 stippled rectangle"] = 5;
+ weight["(xor) 100x10 wide line"] = 5;
+ weight["(xor) 100x10 wide horizontal line segment"] = 5;
+ weight["(xor) 100x10 wide vertical line segment"] = 5;
+ weight["(xor) Scroll 100x100 pixels"] = 5;
+ weight["(xor) Char16 in 23-char line (k24)"] = 5;
+ weight["(xor) Dot"] = 5;
+ weight["(xor) Copy 500x500 1-bit deep plane"] = 5;
+ weight["(xor) 100-pixel ellipse"] = 5;
+ weight["(xor) 100x100 4x4 tiled rectangle"] = 5;
+ weight["(xor) Copy 10x10 1-bit deep plane"] = 5;
+ weight["(xor) 1x1 rectangle"] = 5;
+ weight["(xor) 500-pixel solid circle"] = 4;
+ weight["(xor) 500-pixel filled ellipse"] = 4;
+ weight["(xor) 10-pixel filled ellipse"] = 4;
+ weight["(xor) Fill 100x100 stippled trapezoid"] = 4;
+ weight["(xor) 500x50 wide line"] = 4;
+ weight["(xor) 500-pixel circle"] = 4;
+ weight["(xor) 100-pixel double-dashed line"] = 4;
+ weight["(xor) 500x50 wide horizontal line segment"] = 4;
+ weight["(xor) 500x50 wide vertical line segment"] = 4;
+ weight["(xor) 100-pixel dashed circle"] = 4;
+ weight["(xor) 10x10 opaque stippled rectangle"] = 4;
+ weight["(xor) 10-pixel ellipse"] = 4;
+ weight["(xor) Copy 500x500 from pixmap to pixmap"] = 4;
+ weight["(xor) 100x100 161x145 stippled rectangle"] = 4;
+ weight["(xor) 10x10 161x145 tiled rectangle"] = 4;
+ weight["(xor) Copy 10x10 from window to window"] = 4;
+ weight["(xor) Copy 10x10 from pixmap to pixmap"] = 4;
+ weight["(xor) 10x10 161x145 stippled rectangle"] = 4;
+ weight["(xor) 100-pixel wide circle"] = 4;
+ weight["(xor) 500x500 stippled rectangle"] = 4;
+ weight["(xor) 500-pixel ellipse"] = 4;
+ weight["(xor) 10x10 216x208 tiled rectangle"] = 4;
+ weight["(xor) Fill 100x100 equivalent complex polygons"] = 4;
+ weight["(xor) 100-pixel double-dashed segment"] = 3;
+ weight["(xor) 10x10 161x145 opaque stippled rectangle"] = 3;
+ weight["(xor) Fill 10x10 opaque stippled trapezoid"] = 3;
+ weight["(xor) 100-pixel partial circle"] = 3;
+ weight["(xor) Fill 10x10 161x145 stippled trapezoid"] = 3;
+ weight["(xor) Fill 10x10 161x145 opaque stippled trapezoid"] = 3;
+ weight["(xor) Scroll 500x500 pixels"] = 3;
+ weight["(xor) 100x100 opaque stippled rectangle"] = 3;
+ weight["(xor) Fill 10x10 stippled trapezoid"] = 3;
+ weight["(xor) 100x10 wide dashed line"] = 3;
+ weight["(xor) Copy 10x10 from window to pixmap"] = 3;
+ weight["(xor) Copy 500x500 from window to pixmap"] = 3;
+ weight["(xor) 500x500 opaque stippled rectangle"] = 3;
+ weight["(xor) Fill 10x10 tiled trapezoid"] = 3;
+ weight["(xor) 100x100 161x145 tiled rectangle"] = 3;
+ weight["(xor) 100-pixel partial ellipse"] = 3;
+ weight["(xor) 100-pixel fill slice partial circle"] = 3;
+ weight["(xor) Fill 1x1 equivalent triangle"] = 3;
+ weight["(xor) 100-pixel double-dashed circle"] = 3;
+ weight["(xor) 500x500 4x4 tiled rectangle"] = 3;
+ weight["(xor) 100-pixel wide ellipse"] = 3;
+ weight["(xor) 100-pixel fill chord partial circle"] = 3;
+ weight["(xor) 100x100 216x208 tiled rectangle"] = 3;
+ weight["(xor) Fill 10x10 161x145 tiled trapezoid"] = 3;
+ weight["(xor) Fill 100x100 216x208 tiled trapezoid"] = 3;
+ weight["(xor) 500x500 161x145 stippled rectangle"] = 3;
+ weight["(xor) 500x500 161x145 tiled rectangle"] = 3;
+ weight["(xor) 100x100 161x145 opaque stippled rectangle"] = 3;
+ weight["(xor) 500x500 161x145 opaque stippled rectangle"] = 3;
+ weight["(xor) 10x1 wide line"] = 3;
+ weight["(xor) 500x500 216x208 tiled rectangle"] = 3;
+ weight["(xor) 100-pixel dashed ellipse"] = 3;
+ weight["(xor) Fill 100x100 opaque stippled trapezoid"] = 3;
+ weight["(xor) 10-pixel partial circle"] = 3;
+ weight["(xor) 100x10 wide double-dashed line"] = 3;
+ weight["(xor) Fill 100x100 161x145 stippled trapezoid"] = 3;
+ weight["(xor) Fill 100x100 161x145 opaque stippled trapezoid"] = 3;
+ weight["(xor) 100-pixel fill slice partial ellipse"] = 3;
+ weight["(xor) 1-pixel circle"] = 3;
+ weight["(xor) Fill 10x10 equivalent complex polygon"] = 3;
+ weight["(xor) 100-pixel wide dashed circle"] = 2;
+ weight["(xor) 100-pixel wide double-dashed circle"] = 2;
+ weight["(xor) Scroll 10x10 pixels"] = 2;
+ weight["(xor) 10-pixel wide circle"] = 2;
+ weight["(xor) 100-pixel fill chord partial ellipse"] = 2;
+ weight["(xor) Fill 100x100 tiled trapezoid"] = 2;
+ weight["(xor) 100-pixel double-dashed ellipse"] = 2;
+ weight["(xor) 100-pixel wide dashed ellipse"] = 2;
+ weight["(xor) 100-pixel wide double-dashed ellipse"] = 2;
+ weight["(xor) 10-pixel partial ellipse"] = 2;
+ weight["(xor) 100-pixel wide partial circle"] = 2;
+ weight["(xor) 100-pixel wide partial ellipse"] = 2;
+ weight["(xor) 10-pixel fill slice partial circle"] = 2;
+ weight["(xor) 10-pixel wide ellipse"] = 2;
+ weight["(xor) Fill 100x100 161x145 tiled trapezoid"] = 2;
+ weight["(xor) Fill 10x10 216x208 tiled trapezoid"] = 2;
+ weight["(xor) 10-pixel fill chord partial circle"] = 2;
+ weight["(xor) 500-pixel wide circle"] = 2;
+ weight["(xor) 500-pixel wide ellipse"] = 2;
+ weight["(xor) 1-pixel solid circle"] = 2;
+ weight["(xor) 10-pixel fill chord partial ellipse"] = 2;
+ weight["(xor) 10-pixel fill slice partial ellipse"] = 2;
+ weight["(xor) 10-pixel wide partial circle"] = 1;
+ weight["(xor) 10-pixel wide partial ellipse"] = 1;
+ weight["(xor) 1x1 stippled rectangle"] = 1;
+ weight["(xor) 1x1 161x145 stippled rectangle"] = 1;
+ weight["(xor) 1x1 opaque stippled rectangle"] = 1;
+ weight["(xor) 1x1 161x145 opaque stippled rectangle"] = 1;
+ weight["(xor) 1x1 4x4 tiled rectangle"] = 1;
+ weight["(xor) 1x1 161x145 tiled rectangle"] = 1;
+ weight["(xor) 1x1 216x208 tiled rectangle"] = 1;
+ weight["(xor) ShmPutImage 10x10 square"] = 0;
+ weight["(xor) ShmPutImage 100x100 square"] = 0;
+ weight["(xor) ShmPutImage 500x500 square"] = 0;
+ sumofweights = 0;
+ }
+ $0 ~ /server/ {
+ printf("name:%s\n",substr($0,1,index($0,"server")-2));
+ }
+ {
+ split($0,parts,":"); # get rate and name
+ start = index(parts[1],"(") + 1; # find left parentheses
+ end = index(parts[1],"/"); # find terminating '/'
+ rate = substr(parts[1],start,end-start);# get ops/sec
+
+ name = parts[2];
+ while (substr(name,1,1) == " ") { # remove leading spaces
+ name = substr(name,2,length(name));
+ }
+
+ thisweight = weight[name];
+ weight[name] = 0; # clear to avoid double counting
+ sumofweights += thisweight;
+ printf("%d:",thisweight); # output in new format
+ printf("%9.1f\n",rate);
+ }
+ END{
+ printf("sumof:%9.1f\n",sumofweights);
+ }
+EOS
+
+awk -f awkfile.$$ temp.$$ > rates.$$
+rm -f awkfile.$$ # cleanup
+
+# calculate the weighted average
+
+sumofweights=`grep sumof rates.$$ | awk -F: ' { print($2) }' - `
+if [ "$sumofweights" -ne "4566" ]
+then
+ echo "ERROR: sum of weights =$sumofweights, not equal to 4566.0;"
+ echo "ABORTING!"
+ rm -f rates.$$ temp.$$
+ exit 1
+fi
+
+awk -F: '
+ BEGIN {
+ logsum = 0;
+ name = "tested"
+ }
+ $1 == "name" { name = $2;next }
+ {
+ weight = $1;
+ rate = $2;
+ if (rate > 0.0) {
+ # generate weighted log sum
+ logsum += ( log( rate ) * weight );
+ }
+ }
+ END {
+ SparcStation1 = 2118.51;
+ WeightedAverage = exp(logsum/4566.0);
+ printf("Weighted x11perf of %s server =%6.0f\n", name,WeightedAverage);
+ printf("Weighted x11perf of SparcStation 1 server =%5.0f\n", SparcStation1);
+ printf("Xmark =%8.4f\n", WeightedAverage/SparcStation1);
+ }' rates.$$
+
+rm -f temp.$$ rates.$$ awkfile.$$ # cleanup
+
+exit 0
diff --git a/bitmaps.c b/bitmaps.c
new file mode 100644
index 0000000..4dc60bf
--- /dev/null
+++ b/bitmaps.c
@@ -0,0 +1,878 @@
+/* $Xorg: bitmaps.c,v 1.3 2000/08/17 19:54:08 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+#include "bitmaps.h"
+
+static unsigned char bitmap8x8[] = {
+ 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99
+/* Alternate maps for testing out your stipple code. Only the above should
+ be used for timing, though.
+ 0x00, 0xfe, 0x92, 0x92, 0xfe, 0x92, 0x92, 0xfe
+ 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA
+*/
+};
+
+static unsigned char bitmap4x4[] = {
+ 0x03, 0x06, 0x0c, 0x09
+};
+
+#define oddbit_width 17
+#define oddbit_height 15
+static unsigned char oddbit_bits[] = {
+ 0x01, 0x00, 0x01, 0xc2, 0x87, 0x00, 0x34, 0x58, 0x00, 0x08, 0x20, 0x00,
+ 0x38, 0x38, 0x00, 0x44, 0x44, 0x00, 0x84, 0x42, 0x00, 0x04, 0x41, 0x00,
+ 0x84, 0x42, 0x00, 0x44, 0x44, 0x00, 0x28, 0x28, 0x00, 0x18, 0x30, 0x00,
+ 0x34, 0x58, 0x00, 0xc2, 0x87, 0x00, 0x01, 0x00, 0x01};
+
+/* A big bitmap */
+#define mensetmanus_width 161
+#define mensetmanus_height 145
+
+static unsigned char mensetmanus_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3f, 0xdb, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07,
+ 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf7, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x61, 0x00, 0x00, 0xc6,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff,
+ 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xe1, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xf6, 0x1f, 0x00, 0x00,
+ 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x9f, 0x65, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x07, 0x80, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x9f, 0x6d, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xc7,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x89, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00,
+ 0x00, 0xc0, 0xe1, 0x5b, 0xdb, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x80, 0x83,
+ 0x5b, 0xdb, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x5b, 0x1b, 0x0c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x80, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x5b, 0x1b, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x6d, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0xf8, 0x5b, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0x83, 0x6d, 0x19, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x5b, 0x0b, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x83, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5b, 0x0f, 0x0e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4b, 0x0f, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x79, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x6b, 0xbf, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x6d, 0xb7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xf7, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xfe,
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xd7, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf8, 0xff, 0x07, 0x00,
+ 0x00, 0x00, 0xe0, 0xfe, 0xd7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xff, 0x7f, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0xd6, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+ 0xbf, 0x73, 0x80, 0x3b, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0xe7, 0xd6, 0xef,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb9, 0x73, 0xc0,
+ 0x3b, 0xf0, 0x01, 0x00, 0x00, 0xff, 0xc3, 0xbf, 0xe7, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xb8, 0x7f, 0xe0, 0x3b, 0xc0, 0x03,
+ 0x00, 0xc0, 0xbf, 0xc7, 0xbf, 0xe7, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xb8, 0xff, 0xf8, 0x3b, 0x80, 0x07, 0x00, 0xe0, 0x61,
+ 0x87, 0xfd, 0xe7, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0xb8, 0xf3, 0xff, 0x3b, 0x00, 0x0f, 0x00, 0x78, 0x60, 0x8e, 0xf1, 0x67,
+ 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb8, 0xc3, 0x8f,
+ 0x7b, 0x00, 0x0e, 0x00, 0x38, 0xe0, 0x8c, 0x03, 0x66, 0x87, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xb8, 0x03, 0x83, 0x7b, 0x00, 0x1e,
+ 0x00, 0x1c, 0xe0, 0x1d, 0x03, 0x76, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x07, 0xb8, 0xe3, 0x8f, 0xbb, 0x01, 0x39, 0x00, 0x1e, 0xe0,
+ 0x3b, 0x03, 0xf6, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f,
+ 0xb8, 0xe3, 0x8f, 0x3b, 0xc6, 0x38, 0x00, 0x17, 0xe0, 0x73, 0x07, 0xfe,
+ 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0b, 0xb8, 0xe7, 0x8e,
+ 0x3b, 0x38, 0x78, 0x00, 0x13, 0xe0, 0x77, 0x06, 0xfe, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x12, 0x3c, 0xff, 0xce, 0x3b, 0x00, 0x78,
+ 0x80, 0x13, 0x60, 0xef, 0x0e, 0xfe, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00,
+ 0x00, 0x70, 0x22, 0x3e, 0xfc, 0xfe, 0x39, 0x00, 0xe8, 0x80, 0x61, 0x60,
+ 0xce, 0x0f, 0xfe, 0x00, 0x00, 0x60, 0xf8, 0x00, 0x00, 0x00, 0x70, 0xc2,
+ 0x39, 0xf8, 0x7e, 0x38, 0x00, 0xc8, 0xc0, 0x81, 0x71, 0xde, 0x0f, 0xfe,
+ 0x00, 0x00, 0x60, 0x88, 0x00, 0x00, 0x00, 0x70, 0x04, 0x38, 0xe0, 0x0e,
+ 0x38, 0x00, 0xc4, 0xc0, 0x01, 0x7e, 0xbc, 0x1f, 0xfe, 0x00, 0x00, 0x60,
+ 0x88, 0x00, 0x00, 0x00, 0x78, 0x04, 0x38, 0xe0, 0x0e, 0x38, 0x00, 0xc4,
+ 0xc1, 0x01, 0x60, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x60, 0x84, 0x0f, 0x00,
+ 0x00, 0x78, 0x08, 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x82, 0xe1, 0x01, 0x60,
+ 0x74, 0x3e, 0xfe, 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0xb8, 0x10,
+ 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x81, 0xe1, 0x00, 0x60, 0xe4, 0x3e, 0xfe,
+ 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0x98, 0x20, 0x38, 0xf8, 0x3f,
+ 0x38, 0x80, 0x80, 0xe1, 0x01, 0x60, 0xc4, 0x3c, 0xfe, 0x00, 0x00, 0x60,
+ 0x24, 0x0c, 0x00, 0x00, 0x1c, 0xc1, 0x39, 0x3c, 0x78, 0x38, 0x40, 0x80,
+ 0x61, 0x01, 0x60, 0xc4, 0x79, 0xfe, 0x00, 0x00, 0x60, 0x22, 0x32, 0x00,
+ 0x00, 0x1c, 0x01, 0x3e, 0x1c, 0xf0, 0x38, 0xf0, 0x9f, 0x61, 0x01, 0x60,
+ 0x84, 0x7b, 0xee, 0x00, 0x00, 0x60, 0x12, 0x21, 0x00, 0x00, 0x1c, 0x02,
+ 0x38, 0x0e, 0xe7, 0xf8, 0x3f, 0xe0, 0x61, 0x00, 0x60, 0x04, 0xf7, 0xce,
+ 0x00, 0x00, 0x60, 0x92, 0x10, 0x00, 0x00, 0x1c, 0x04, 0x38, 0x06, 0xff,
+ 0x38, 0x40, 0x80, 0x61, 0x02, 0x60, 0x04, 0xe7, 0xcf, 0x00, 0x00, 0x60,
+ 0x8a, 0x18, 0x00, 0x00, 0x1c, 0x18, 0x38, 0x07, 0xf0, 0x38, 0x00, 0x81,
+ 0x61, 0x02, 0x60, 0x04, 0xee, 0xcf, 0xff, 0x03, 0x60, 0x49, 0xe4, 0x00,
+ 0x00, 0x1c, 0x70, 0x38, 0x07, 0xe7, 0x38, 0x00, 0x82, 0x61, 0x04, 0x60,
+ 0x04, 0xdc, 0xcf, 0x01, 0x04, 0x60, 0x25, 0x42, 0x00, 0x00, 0x1c, 0xfe,
+ 0x3f, 0x03, 0xff, 0x38, 0x00, 0x84, 0x61, 0x08, 0x60, 0x04, 0xfc, 0xcf,
+ 0xf8, 0xff, 0x60, 0x95, 0x31, 0x00, 0x00, 0xfc, 0x01, 0xff, 0x03, 0xf0,
+ 0xf8, 0x1f, 0x88, 0x61, 0x10, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe1,
+ 0x53, 0x0c, 0x00, 0x00, 0x38, 0xf0, 0xff, 0x03, 0xef, 0xf8, 0x7f, 0x90,
+ 0x61, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x00, 0xff, 0xe3, 0x2b, 0xfe, 0x00,
+ 0x00, 0x18, 0xf8, 0xff, 0x03, 0xff, 0x7c, 0xf0, 0x90, 0x61, 0x00, 0x3e,
+ 0x36, 0xe3, 0xe1, 0x00, 0x00, 0xe3, 0x9f, 0x60, 0x00, 0x00, 0x38, 0x3c,
+ 0x00, 0x03, 0xf0, 0x1f, 0xe0, 0xa0, 0xe1, 0x00, 0x30, 0x22, 0xe2, 0xc0,
+ 0x00, 0xff, 0xe3, 0x7f, 0x18, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x07, 0xe7,
+ 0x07, 0xc0, 0xe1, 0xc1, 0x00, 0x18, 0x22, 0xe2, 0xc0, 0x00, 0x00, 0xe1,
+ 0x1f, 0x07, 0x00, 0x00, 0x38, 0x06, 0x00, 0x07, 0xef, 0x01, 0xc0, 0xc1,
+ 0xc1, 0x01, 0x16, 0x24, 0xe2, 0xc0, 0x01, 0xff, 0xe1, 0xff, 0x00, 0x00,
+ 0x00, 0x70, 0x07, 0x00, 0x0e, 0xf8, 0x00, 0x80, 0xc3, 0xc0, 0xf1, 0x11,
+ 0x24, 0xe4, 0xc0, 0x03, 0xe0, 0xe1, 0x7f, 0x00, 0x00, 0x00, 0x70, 0x07,
+ 0x00, 0x1e, 0x3c, 0x00, 0x80, 0xe3, 0x80, 0x0f, 0x10, 0x24, 0xe4, 0xc0,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xfc, 0x0f,
+ 0x00, 0x00, 0x63, 0x80, 0x01, 0x08, 0x44, 0xe4, 0xc0, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x73,
+ 0x80, 0x03, 0x08, 0x44, 0xe4, 0xc0, 0xfc, 0x00, 0x07, 0x0e, 0x00, 0x00,
+ 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x33, 0x00, 0x03, 0x08,
+ 0x44, 0xe4, 0xe0, 0xcc, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0xc0, 0x03,
+ 0x00, 0x78, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x07, 0x04, 0x44, 0xe8, 0x70,
+ 0xcc, 0x01, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x3e, 0x00,
+ 0x00, 0x80, 0x1f, 0x00, 0x0e, 0x04, 0x44, 0xe8, 0x38, 0xcc, 0x81, 0xe7,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x80, 0x0f,
+ 0x00, 0x1c, 0x02, 0x44, 0xf8, 0x1e, 0xcc, 0xe1, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xc0, 0x23, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x38, 0x01,
+ 0x42, 0xfc, 0x0f, 0xcc, 0xf1, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0xf0, 0x39, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0xc2, 0xff, 0x07,
+ 0xcc, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x0e, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03, 0xe2, 0xe7, 0x07, 0xcc, 0x1f, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0x23, 0xe0, 0xff, 0xff, 0x00,
+ 0x00, 0xc0, 0x1f, 0xff, 0x64, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0x3c, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff,
+ 0x7f, 0x64, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+ 0xf8, 0x1f, 0x78, 0x7c, 0x7f, 0x00, 0x00, 0x00, 0xfc, 0x20, 0x64, 0x06,
+ 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf8, 0x33, 0x1c,
+ 0x38, 0x66, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x6c, 0x06, 0xcc, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x3e, 0x0e, 0x38, 0x76, 0x00,
+ 0x00, 0x00, 0x0c, 0x20, 0x68, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x38, 0xf8, 0x87, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c,
+ 0x20, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
+ 0x78, 0xf8, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06,
+ 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf8, 0xff, 0x0f,
+ 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf8, 0xff, 0x0e, 0x38, 0x76, 0x00,
+ 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xf8, 0xe1, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c,
+ 0x08, 0x68, 0x06, 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x08, 0x68, 0x06,
+ 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e,
+ 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00,
+ 0x00, 0x00, 0x1c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c,
+ 0x02, 0x68, 0x06, 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x68, 0x06,
+ 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e,
+ 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00,
+ 0x00, 0x00, 0x18, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98,
+ 0x00, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98, 0x00, 0x68, 0x06,
+ 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x38, 0xe0, 0x0e,
+ 0x38, 0x1e, 0x00, 0x00, 0x00, 0x58, 0x00, 0x6c, 0x0e, 0xcc, 0x18, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xe0, 0x0e, 0x38, 0x1e, 0x00,
+ 0x00, 0x00, 0x38, 0x00, 0x64, 0x0e, 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0e, 0x1c, 0x1e, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x64, 0x1e, 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01,
+ 0xe0, 0xe1, 0x0e, 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e,
+ 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0xef, 0xce,
+ 0x07, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e, 0xcc, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xff, 0xfe, 0x03, 0x1e, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x64, 0x7e, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x64, 0x66, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x00, 0xe0, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x66, 0xe6,
+ 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x0e,
+ 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x1e, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x70, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38,
+ 0x00, 0x62, 0x86, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0xf0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x86,
+ 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xfc, 0x00, 0x00,
+ 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x8e, 0xcf, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x0e, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0x7f, 0xfe, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0x3f, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
+ 0xe0, 0x01, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x8f, 0x07,
+ 0x9e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x07, 0x00,
+ 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x30, 0x00, 0xc0, 0xff, 0x3f, 0xc0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+ 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00,
+ 0x38, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x38, 0x00, 0x38, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0xdc, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00,
+ 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x9c, 0x03, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x18, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00,
+ 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00,
+ 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00,
+ 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00,
+ 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00,
+ 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00,
+ 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x00,
+ 0x30, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x30, 0xe0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0x3c, 0x00, 0x30, 0xf0, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0x7e, 0x00, 0x70, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f,
+ 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xe7, 0x00,
+ 0x70, 0xbc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1f, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe3, 0x00, 0x60, 0x1e, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0xfc, 0xc1, 0x01, 0xe0, 0x0f, 0x0f, 0x00, 0x00, 0x00,
+ 0x80, 0x07, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0xf8, 0x80, 0x03, 0xe0, 0x03, 0x1e, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0,
+ 0x1b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x78, 0x80, 0x07,
+ 0xe0, 0x01, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xc0, 0x1b, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0f, 0xe0, 0x01, 0x38,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0x0e, 0x1e, 0xc0, 0x71, 0xf8, 0x00, 0x00, 0x00,
+ 0x78, 0x00, 0xdc, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x1f, 0x1e, 0xc0, 0xf9, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+#define escherknot_width 216
+#define escherknot_height 208
+
+static unsigned char escherknot_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x5f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x6f, 0xf6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0xff, 0x3a, 0x13, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x02, 0x51, 0x71, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2f, 0x20, 0xd9, 0x88,
+ 0x9b, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x82,
+ 0xac, 0x44, 0x4e, 0x1c, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0x40, 0x02, 0x44, 0x60, 0xe2, 0xfc, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x25, 0x09, 0x90, 0x22, 0x13, 0xb7, 0x9a, 0x1e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x10, 0x89,
+ 0x18, 0xe3, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x08,
+ 0x01, 0x10, 0xc8, 0xa8, 0xd5, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x83, 0x80, 0x20, 0x40, 0x82, 0x00, 0x66, 0x9c, 0xec, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x08, 0x24, 0x12, 0x93, 0x5b,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x12, 0x80, 0x04, 0x01, 0x00, 0x80,
+ 0x19, 0x33, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x80, 0x00,
+ 0x20, 0x08, 0x12, 0xc4, 0x68, 0x26, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x02, 0x04, 0x24, 0x00, 0x01, 0x40, 0x24, 0x8c, 0xcd, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x80, 0x49, 0x10, 0x90, 0x00, 0x21, 0x20, 0x08, 0x11, 0x43, 0xd9,
+ 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8,
+ 0xff, 0xff, 0x0b, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x30, 0xb9, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x97, 0x04, 0x08, 0xfe, 0x05, 0x30, 0x10, 0x12, 0x20, 0x20,
+ 0x04, 0x00, 0x80, 0x48, 0x0c, 0xa3, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3e, 0x92, 0x20, 0x49, 0x40, 0x3e, 0x0e, 0x82,
+ 0x00, 0x84, 0x25, 0x01, 0x80, 0x00, 0x80, 0xc8, 0x34, 0xed, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x25, 0x01, 0x04, 0x01, 0x08,
+ 0xd0, 0x17, 0x00, 0x80, 0x25, 0x01, 0xad, 0x04, 0x12, 0x20, 0x23, 0x4c,
+ 0x6a, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x48,
+ 0x92, 0x20, 0x41, 0x92, 0x9e, 0x80, 0x24, 0x24, 0x29, 0x00, 0x04, 0x00,
+ 0x10, 0x98, 0xcc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x4f, 0x10, 0x01, 0x90, 0x24, 0x40, 0x12, 0xf0, 0x00, 0x24, 0x41, 0x0b,
+ 0xa9, 0x10, 0x00, 0x00, 0x04, 0xd9, 0x96, 0x0e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0x00, 0x92, 0x48, 0x02, 0x04, 0x09, 0xc0, 0x84, 0x8f,
+ 0x29, 0x2d, 0xf8, 0xa9, 0x02, 0x00, 0x00, 0x20, 0x90, 0xf4, 0x1e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x24, 0x91, 0x04, 0x50, 0x22, 0x24,
+ 0x1b, 0x12, 0x7a, 0x48, 0xca, 0x03, 0x21, 0x10, 0x00, 0x00, 0x48, 0x93,
+ 0xff, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x24, 0x92, 0x20,
+ 0x81, 0xda, 0x24, 0xc8, 0x16, 0xd0, 0xe7, 0x50, 0xd2, 0xbf, 0x03, 0x00,
+ 0x80, 0x00, 0x30, 0x29, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03,
+ 0x20, 0x80, 0x24, 0x41, 0x12, 0x2a, 0x41, 0xb2, 0x80, 0x33, 0x0e, 0x7e,
+ 0x88, 0x1c, 0x01, 0x00, 0xa0, 0x24, 0x69, 0x75, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x82, 0x44, 0x11, 0x24, 0x09, 0x90, 0xa4, 0x4d, 0xd2, 0x92,
+ 0x9e, 0xd3, 0x83, 0x6b, 0x62, 0x00, 0x00, 0x10, 0x22, 0xff, 0x7f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x04, 0x92, 0x24, 0x6b, 0x53, 0x32,
+ 0x59, 0x90, 0x16, 0xfa, 0xb4, 0xf4, 0xff, 0x0f, 0x01, 0x00, 0x90, 0x68,
+ 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x90, 0x24, 0x11, 0x24,
+ 0x49, 0xda, 0x82, 0xc5, 0x92, 0xd2, 0xd0, 0x9e, 0x1e, 0x00, 0x78, 0x0a,
+ 0x00, 0x00, 0x05, 0xd2, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x02,
+ 0x44, 0xb2, 0x65, 0xea, 0x49, 0x9e, 0x2c, 0x4b, 0x1a, 0xd2, 0xeb, 0xe3,
+ 0xff, 0xc7, 0x09, 0x00, 0x20, 0x68, 0xff, 0xd6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x90, 0x40, 0x92, 0x24, 0x09, 0x5f, 0xd2, 0x64, 0x59, 0x72,
+ 0x56, 0x7f, 0xfd, 0xdf, 0x1f, 0x12, 0x00, 0x20, 0x49, 0x92, 0xde, 0x01,
+ 0x00, 0x00, 0x00, 0x80, 0x41, 0x92, 0x4c, 0x92, 0x24, 0x25, 0xc9, 0x8b,
+ 0x2e, 0xcb, 0x92, 0x4b, 0x5a, 0x2f, 0x75, 0xf4, 0x04, 0x00, 0x00, 0x41,
+ 0xf6, 0x74, 0x01, 0x00, 0x00, 0x00, 0x40, 0x49, 0x02, 0x00, 0xba, 0xb6,
+ 0xfd, 0x49, 0xf8, 0x74, 0x6d, 0x4b, 0x72, 0xed, 0xdb, 0xff, 0xcf, 0x53,
+ 0x00, 0x00, 0x48, 0xb6, 0xd7, 0x03, 0x00, 0x00, 0x00, 0x60, 0x48, 0x10,
+ 0xc9, 0x93, 0x24, 0x00, 0x7b, 0xc3, 0xa6, 0x69, 0x58, 0x5a, 0xfb, 0xfa,
+ 0xa5, 0xbe, 0x16, 0x00, 0x00, 0x92, 0xa4, 0xfd, 0x03, 0x00, 0x00, 0x00,
+ 0x30, 0x01, 0x20, 0x5d, 0xa2, 0xfe, 0x7f, 0x01, 0x4f, 0x1a, 0xcd, 0x6b,
+ 0x6a, 0xa9, 0x5f, 0xff, 0xf3, 0x24, 0x01, 0x40, 0xc0, 0xb4, 0xf4, 0x03,
+ 0x00, 0x00, 0x00, 0x2c, 0x88, 0x84, 0x89, 0xb6, 0x00, 0x24, 0x7d, 0x69,
+ 0xf2, 0x34, 0xad, 0x99, 0x2d, 0xf7, 0xff, 0x9f, 0x4b, 0x00, 0x00, 0x92,
+ 0xa6, 0xad, 0x07, 0x00, 0x00, 0x00, 0x06, 0x91, 0x24, 0xe9, 0xa4, 0xfd,
+ 0xa5, 0xa9, 0x4b, 0x93, 0xe7, 0x34, 0x63, 0xf9, 0xfc, 0xd5, 0xef, 0x16,
+ 0x00, 0x40, 0x90, 0xb4, 0xbd, 0x07, 0x00, 0x00, 0x00, 0x6a, 0x80, 0x4c,
+ 0x96, 0xbe, 0x2d, 0xfd, 0x2f, 0x7c, 0x5e, 0x9c, 0x67, 0xad, 0xa5, 0xfd,
+ 0xff, 0xbf, 0x29, 0x00, 0x00, 0x92, 0x76, 0xed, 0x06, 0x00, 0x00, 0x00,
+ 0x05, 0x12, 0x48, 0x53, 0x25, 0x65, 0x25, 0xf4, 0xe5, 0xd3, 0x72, 0x9c,
+ 0x35, 0xdf, 0xf6, 0x7f, 0xf5, 0x56, 0x00, 0x00, 0x92, 0xa4, 0xed, 0x0f,
+ 0x00, 0x00, 0x80, 0x49, 0x20, 0x59, 0x38, 0xec, 0xff, 0xff, 0xad, 0x2f,
+ 0x5d, 0xd3, 0x33, 0xe6, 0x24, 0xed, 0xff, 0xdf, 0x2d, 0x01, 0x40, 0x80,
+ 0x24, 0xbd, 0x07, 0x00, 0x00, 0xc0, 0x48, 0x24, 0x49, 0x87, 0x37, 0x21,
+ 0xa0, 0xbd, 0xf4, 0x79, 0x4f, 0xc7, 0x9c, 0xde, 0xf6, 0xff, 0xff, 0x5b,
+ 0x08, 0x00, 0x92, 0xfc, 0xe9, 0x0e, 0x00, 0x00, 0x20, 0x89, 0x40, 0xd3,
+ 0xf4, 0x49, 0xff, 0xff, 0xe7, 0x2f, 0xcf, 0x79, 0x9c, 0x53, 0xb2, 0x35,
+ 0xff, 0xff, 0x37, 0x00, 0x40, 0x90, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x30,
+ 0x91, 0x49, 0x32, 0x2d, 0xff, 0x6b, 0xb7, 0xbd, 0xbc, 0x3c, 0xef, 0x79,
+ 0xce, 0xde, 0xd6, 0xfd, 0xff, 0x9f, 0x00, 0x00, 0x92, 0xa6, 0xad, 0x0b,
+ 0x00, 0x00, 0x30, 0x11, 0x89, 0x8c, 0xcb, 0x5b, 0xba, 0xaf, 0xf6, 0xd7,
+ 0xe7, 0x35, 0xe7, 0x59, 0xb3, 0xfb, 0xff, 0xff, 0x7f, 0x04, 0x40, 0x80,
+ 0xe4, 0xb9, 0x1f, 0x00, 0x00, 0x48, 0x22, 0x91, 0x66, 0x79, 0xeb, 0xff,
+ 0xff, 0xdf, 0xbe, 0xbe, 0xe7, 0x8c, 0x75, 0x6b, 0x4a, 0xfa, 0xbf, 0x7f,
+ 0x00, 0x00, 0x82, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x4c, 0x22, 0xb2, 0x79,
+ 0x5e, 0xfa, 0x5b, 0xa9, 0xfd, 0xeb, 0xf5, 0x9c, 0x3d, 0xc6, 0xcc, 0xee,
+ 0xed, 0x01, 0xf8, 0x00, 0x40, 0x82, 0xb6, 0xa9, 0x1b, 0x00, 0x00, 0x94,
+ 0x64, 0x66, 0x8e, 0xd3, 0x97, 0xfe, 0xff, 0xd7, 0xdf, 0x9f, 0x7b, 0xf3,
+ 0x3c, 0x35, 0x59, 0x6b, 0x00, 0x70, 0x00, 0x00, 0x40, 0xe4, 0xed, 0x1e,
+ 0x00, 0x00, 0x92, 0xc4, 0x34, 0xf3, 0xfc, 0xfd, 0x5f, 0xad, 0x7d, 0xfa,
+ 0x7a, 0xce, 0x8e, 0xb3, 0x76, 0x2f, 0xfd, 0x00, 0xe0, 0x04, 0x00, 0x9a,
+ 0x26, 0xaf, 0x1e, 0x00, 0x00, 0x13, 0x88, 0xcc, 0xb5, 0x3f, 0xbf, 0xff,
+ 0xff, 0xd7, 0xef, 0xef, 0xbd, 0x79, 0x6a, 0xde, 0xec, 0xab, 0x01, 0xc0,
+ 0x00, 0x00, 0x40, 0xb6, 0xbd, 0x1b, 0x00, 0x00, 0x05, 0x91, 0xeb, 0x5c,
+ 0xeb, 0xeb, 0xff, 0xff, 0xff, 0x7e, 0xef, 0x6b, 0xef, 0xcd, 0x99, 0xb3,
+ 0xe4, 0x07, 0x80, 0x00, 0x40, 0x49, 0xb2, 0xe5, 0x1a, 0x00, 0x80, 0x20,
+ 0x32, 0xb1, 0xe7, 0x79, 0x7f, 0xf7, 0xff, 0xfd, 0xeb, 0xbd, 0xfe, 0x2c,
+ 0x3d, 0x6b, 0xb6, 0xaf, 0x06, 0x80, 0x00, 0x00, 0x41, 0x96, 0xfe, 0x1e,
+ 0x00, 0x80, 0x44, 0xb2, 0x9b, 0xf9, 0xde, 0xff, 0xff, 0xff, 0x7f, 0xbf,
+ 0xf7, 0xbb, 0xb3, 0x77, 0xce, 0xce, 0xb6, 0x0d, 0x80, 0x01, 0x00, 0x49,
+ 0xf2, 0x94, 0x1f, 0x00, 0x40, 0x49, 0x44, 0xe6, 0x9e, 0x77, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xf7, 0x7e, 0xd6, 0xbc, 0xd9, 0xba, 0x3b, 0x80,
+ 0x00, 0x00, 0x64, 0x93, 0xf7, 0x1b, 0x00, 0x40, 0x89, 0xec, 0x7e, 0x67,
+ 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xdb, 0x99, 0x33, 0x37,
+ 0xd3, 0x36, 0x80, 0x01, 0x80, 0x24, 0xda, 0xd6, 0x1e, 0x00, 0x20, 0x90,
+ 0x99, 0x99, 0x7b, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbd, 0x37,
+ 0x63, 0xf3, 0x66, 0xdb, 0x7a, 0x80, 0x00, 0x00, 0x24, 0x59, 0xde, 0x1f,
+ 0x00, 0x60, 0x12, 0xb3, 0xf7, 0xdd, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xf7, 0xfe, 0x6e, 0xce, 0xdd, 0x6d, 0xd7, 0x80, 0x00, 0x80, 0x20,
+ 0xcb, 0xfb, 0x1f, 0x00, 0x10, 0x20, 0x6e, 0x66, 0x76, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xde, 0xdb, 0x9b, 0x99, 0xb3, 0x5d, 0x6b, 0x81,
+ 0x00, 0x40, 0x96, 0x59, 0x6a, 0x1f, 0x00, 0x98, 0xc4, 0xe4, 0xdf, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x6f, 0x7b, 0x37, 0x7f,
+ 0xb3, 0xdd, 0x83, 0x00, 0x00, 0xb0, 0xed, 0xef, 0x1d, 0x00, 0x10, 0x88,
+ 0x9e, 0xdd, 0xcd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xed,
+ 0x6c, 0xe6, 0xcc, 0x76, 0x6d, 0xc1, 0x00, 0x40, 0x91, 0x24, 0x7b, 0x1f,
+ 0x00, 0x08, 0xd1, 0xf1, 0x66, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xdf, 0xbd, 0xbf, 0xd9, 0xdd, 0xdd, 0xb6, 0x47, 0x00, 0x00, 0xd8,
+ 0xb4, 0xad, 0x1f, 0x00, 0x24, 0x24, 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xb7, 0x9d, 0x33, 0xd9, 0x96, 0x4e,
+ 0x00, 0x20, 0x49, 0xf7, 0xfd, 0x1e, 0x00, 0x48, 0xe4, 0xac, 0xb9, 0xdd,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdd, 0x76, 0xb6,
+ 0xb7, 0xfd, 0x7a, 0x00, 0x00, 0x44, 0x96, 0xb7, 0x1f, 0x00, 0x02, 0x9a,
+ 0xbe, 0x6f, 0x77, 0xff, 0xff, 0x7f, 0x61, 0xd9, 0xff, 0xff, 0xff, 0xfd,
+ 0xdd, 0x66, 0xed, 0x66, 0x5b, 0x37, 0x00, 0x90, 0x64, 0xb9, 0xf6, 0x1f,
+ 0x00, 0x02, 0xc9, 0xf3, 0xee, 0xfd, 0xff, 0xff, 0x2f, 0x24, 0x4f, 0xfe,
+ 0xff, 0xff, 0x7f, 0x37, 0xdb, 0xcd, 0x7c, 0xff, 0x3a, 0x00, 0x88, 0x24,
+ 0xdb, 0xde, 0x1a, 0x00, 0x13, 0x31, 0x6f, 0xbb, 0xdf, 0xff, 0xff, 0x21,
+ 0xa0, 0x64, 0xf3, 0xff, 0xff, 0xe7, 0xff, 0x96, 0xbb, 0x9b, 0xa5, 0x1d,
+ 0x00, 0x60, 0x32, 0xe9, 0xdb, 0x0f, 0x00, 0x65, 0xe6, 0x3c, 0xfb, 0xf6,
+ 0xff, 0x7f, 0x10, 0xa4, 0xb5, 0x9d, 0xfe, 0xdf, 0xdf, 0xdd, 0x6d, 0x32,
+ 0xb3, 0x7d, 0x0d, 0x00, 0x0b, 0x93, 0x7c, 0x7b, 0x0f, 0x00, 0x89, 0xdc,
+ 0xb3, 0xed, 0xfb, 0xff, 0x1f, 0x10, 0x90, 0x92, 0xd9, 0xfe, 0x7f, 0xff,
+ 0x77, 0xdb, 0xee, 0x6e, 0xdb, 0x0e, 0x00, 0x20, 0xdd, 0x66, 0x6f, 0x0f,
+ 0x80, 0x91, 0x5a, 0xfb, 0xbe, 0xef, 0xff, 0x0f, 0x10, 0xda, 0x92, 0xee,
+ 0xff, 0xff, 0xff, 0xf7, 0xb7, 0xcd, 0xee, 0xde, 0x07, 0x00, 0x24, 0x49,
+ 0xb6, 0xed, 0x0f, 0x00, 0x12, 0x6b, 0xcd, 0xf3, 0xbe, 0xff, 0x07, 0x08,
+ 0x48, 0xda, 0x76, 0xb7, 0xff, 0xff, 0xdd, 0x6e, 0xba, 0x99, 0x65, 0x03,
+ 0x40, 0x92, 0xe4, 0xba, 0xbd, 0x0e, 0x80, 0x62, 0xed, 0x7d, 0x5f, 0xf7,
+ 0xff, 0x01, 0x08, 0x28, 0xc9, 0x26, 0xbb, 0xff, 0xff, 0xff, 0x99, 0xb7,
+ 0xbb, 0x7d, 0x03, 0x00, 0x89, 0x64, 0xdb, 0xf6, 0x07, 0x40, 0x0c, 0x35,
+ 0xe7, 0x79, 0xdd, 0xff, 0x01, 0x84, 0xa5, 0x7d, 0xba, 0xdd, 0xfe, 0x7f,
+ 0xbf, 0xbf, 0x6d, 0x76, 0xdb, 0x01, 0x00, 0x48, 0x36, 0xdb, 0xd6, 0x07,
+ 0xc0, 0x88, 0xb4, 0xb6, 0xbf, 0xff, 0x7f, 0x00, 0x0c, 0x24, 0x44, 0xdb,
+ 0xed, 0xff, 0xdf, 0xef, 0x6e, 0xdb, 0x6e, 0xb7, 0x00, 0x80, 0x44, 0x93,
+ 0xed, 0x5b, 0x07, 0x40, 0x91, 0xd2, 0xfa, 0xfc, 0xf6, 0x7f, 0x00, 0x02,
+ 0xb4, 0x35, 0xd9, 0xef, 0xff, 0xff, 0xfb, 0xef, 0xb6, 0xc9, 0xe4, 0x00,
+ 0x10, 0x24, 0xd9, 0x6d, 0xfb, 0x03, 0x00, 0x27, 0xfe, 0xd3, 0xd6, 0xdb,
+ 0x3f, 0x00, 0xa2, 0x94, 0xb4, 0xdb, 0x7c, 0xff, 0xff, 0xbf, 0xd9, 0xad,
+ 0xdb, 0x7d, 0x00, 0x40, 0x32, 0xd9, 0xb6, 0xef, 0x03, 0x60, 0xe4, 0x5a,
+ 0x5f, 0x5f, 0xff, 0x1f, 0x00, 0x02, 0x52, 0x92, 0xec, 0xb6, 0xff, 0xff,
+ 0xef, 0xff, 0x6d, 0xb6, 0x3b, 0x00, 0x28, 0x90, 0xcc, 0xbe, 0xfd, 0x03,
+ 0xa0, 0x88, 0xeb, 0xf9, 0xfd, 0xf5, 0x1f, 0x00, 0x82, 0x53, 0xbb, 0x6d,
+ 0xf7, 0xff, 0xf9, 0xff, 0x6f, 0xdb, 0x6d, 0x1b, 0x00, 0x04, 0xc9, 0x66,
+ 0xdb, 0x57, 0x03, 0xa0, 0x52, 0xaf, 0xa7, 0x97, 0xff, 0x0f, 0x00, 0x51,
+ 0x48, 0xda, 0x66, 0xdb, 0xff, 0xf8, 0xdf, 0xed, 0xbe, 0xed, 0x0e, 0x00,
+ 0x92, 0x64, 0x32, 0xeb, 0xf6, 0x01, 0x20, 0x63, 0xbd, 0xbc, 0xfc, 0xfa,
+ 0x0f, 0x00, 0x09, 0x20, 0x89, 0x3e, 0xff, 0xff, 0xe0, 0x7f, 0xdf, 0x6f,
+ 0xdb, 0x07, 0x00, 0x01, 0x24, 0xbb, 0xed, 0xfe, 0x01, 0xa0, 0xce, 0xf5,
+ 0xf6, 0xdb, 0xdf, 0x07, 0x00, 0x41, 0xad, 0x5f, 0xf2, 0xed, 0xff, 0xc0,
+ 0xff, 0xbf, 0xdd, 0x92, 0x03, 0x00, 0x44, 0xb2, 0xd9, 0x7d, 0xfb, 0x01,
+ 0xe0, 0xaa, 0xdf, 0x9b, 0x7f, 0xfb, 0x07, 0x80, 0x28, 0x21, 0x64, 0xbb,
+ 0x7f, 0x7f, 0x80, 0xff, 0xf6, 0xbb, 0xee, 0x03, 0x80, 0x22, 0x99, 0xed,
+ 0xb6, 0xff, 0x00, 0x90, 0xb8, 0x5e, 0x5b, 0x6b, 0xed, 0x03, 0x00, 0x01,
+ 0xa6, 0x6d, 0xdb, 0xf6, 0x7f, 0x00, 0xff, 0xff, 0xf6, 0xcd, 0x00, 0x40,
+ 0x10, 0xc9, 0x6c, 0xff, 0xf7, 0x00, 0xa0, 0xe3, 0x72, 0xeb, 0xef, 0xff,
+ 0x03, 0x80, 0xe0, 0x90, 0x24, 0xdb, 0xbd, 0x3f, 0x00, 0xfe, 0xdb, 0x6f,
+ 0xfb, 0x00, 0x00, 0x89, 0x4c, 0xb6, 0xd9, 0x7e, 0x00, 0x70, 0xaf, 0xaf,
+ 0x6f, 0xb5, 0xde, 0x03, 0x80, 0x94, 0x92, 0xb6, 0xf9, 0xf6, 0x3f, 0x00,
+ 0xfc, 0xbf, 0xdd, 0x7b, 0x00, 0x10, 0x48, 0x26, 0xb3, 0xdf, 0x7f, 0x00,
+ 0x70, 0xd8, 0xae, 0xfd, 0xff, 0xf7, 0x03, 0x80, 0x00, 0xd2, 0x36, 0xcf,
+ 0xdf, 0x3f, 0x00, 0xb8, 0x6d, 0xdf, 0x16, 0x00, 0x48, 0x44, 0xb2, 0xfb,
+ 0x6c, 0x3f, 0x00, 0x50, 0x75, 0xfd, 0xa5, 0xd5, 0xfe, 0x01, 0x40, 0xd1,
+ 0x12, 0xa2, 0x7d, 0xfb, 0x1f, 0x00, 0xf0, 0xff, 0xbf, 0x0d, 0x00, 0x20,
+ 0x12, 0x9b, 0xcd, 0xf6, 0x3f, 0x00, 0x90, 0xd5, 0xa7, 0xfd, 0x77, 0xab,
+ 0x03, 0x40, 0x1c, 0xc8, 0xbe, 0x6d, 0xfb, 0x1f, 0x00, 0xe0, 0xff, 0xee,
+ 0x07, 0x00, 0x04, 0x91, 0xc9, 0x7e, 0xbf, 0x1f, 0x00, 0x30, 0x57, 0xbf,
+ 0xa6, 0xde, 0xfd, 0x01, 0x40, 0x40, 0x6b, 0xd3, 0x6e, 0xef, 0x0f, 0x00,
+ 0xc0, 0xeb, 0x7d, 0x03, 0x00, 0x90, 0xc8, 0x6c, 0x76, 0xfb, 0x0f, 0x00,
+ 0x70, 0x5c, 0xe5, 0xf7, 0xfa, 0xeb, 0x01, 0x40, 0x50, 0x49, 0x92, 0xf4,
+ 0xfd, 0x0f, 0x00, 0xc0, 0xff, 0xdb, 0x01, 0x80, 0x44, 0x44, 0x66, 0xbb,
+ 0x6f, 0x0f, 0x00, 0xd0, 0xf1, 0x95, 0xf6, 0x6f, 0xad, 0x01, 0x40, 0x08,
+ 0x78, 0xdb, 0xb6, 0xef, 0x0f, 0x00, 0x00, 0xdf, 0xd6, 0x00, 0x00, 0x20,
+ 0x32, 0xb3, 0xdb, 0xfd, 0x0f, 0x00, 0x10, 0xd7, 0xf7, 0xb6, 0xd8, 0xeb,
+ 0x03, 0x20, 0x43, 0x27, 0xd9, 0xb6, 0xfd, 0x0f, 0x00, 0x00, 0xff, 0x7e,
+ 0x00, 0x40, 0x12, 0x93, 0xd9, 0xec, 0xb6, 0x07, 0x00, 0x70, 0x55, 0xdd,
+ 0xf6, 0x6f, 0xbb, 0x01, 0x40, 0x28, 0xa1, 0x6f, 0xb6, 0xb7, 0x0f, 0x00,
+ 0x00, 0xde, 0x1f, 0x00, 0x80, 0x88, 0xd8, 0xcc, 0x66, 0xff, 0x03, 0x00,
+ 0x70, 0xf4, 0xf5, 0xdb, 0xaa, 0xee, 0x01, 0x60, 0x28, 0x2d, 0x49, 0xf7,
+ 0xf6, 0x07, 0x00, 0x00, 0x7c, 0x0f, 0x00, 0x08, 0x48, 0x66, 0x6e, 0xfb,
+ 0xef, 0x03, 0x00, 0xd0, 0xd5, 0xdf, 0x52, 0xff, 0xda, 0x03, 0x20, 0xa3,
+ 0xa5, 0xd9, 0xb2, 0xff, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x20, 0x22,
+ 0x33, 0x37, 0xbf, 0xfd, 0x01, 0x00, 0x70, 0x5f, 0xf7, 0xfe, 0xab, 0x6b,
+ 0x02, 0xa0, 0xa8, 0xb4, 0x6d, 0xdf, 0xf6, 0x07, 0x00, 0x00, 0xf8, 0x01,
+ 0x00, 0x12, 0x33, 0x11, 0xd9, 0xdd, 0xff, 0x01, 0x00, 0x70, 0x75, 0xd5,
+ 0x52, 0xea, 0x8a, 0x03, 0x20, 0x84, 0x36, 0x69, 0xba, 0xdb, 0x07, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0x81, 0xc8, 0xcc, 0xdd, 0xed, 0xff, 0x00, 0x00,
+ 0x60, 0xd5, 0xdf, 0xf6, 0xae, 0x6b, 0x03, 0x00, 0xa1, 0xa4, 0x6d, 0xdf,
+ 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x40, 0x44, 0xc6, 0xcc, 0x64, 0xb7,
+ 0xfd, 0x00, 0x00, 0xe0, 0x55, 0xf7, 0xd6, 0xea, 0xba, 0x07, 0x20, 0x94,
+ 0x94, 0x6d, 0xfb, 0xdb, 0x07, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x32,
+ 0x76, 0x77, 0xff, 0x7f, 0x00, 0x00, 0x60, 0x7d, 0xd5, 0xb6, 0x3f, 0xaf,
+ 0x06, 0xa0, 0xa4, 0x95, 0x6c, 0x9b, 0xee, 0x07, 0x00, 0x00, 0x18, 0x00,
+ 0x10, 0x92, 0x15, 0x73, 0xbb, 0xd9, 0x3f, 0x00, 0x00, 0xe0, 0xf5, 0xff,
+ 0xf7, 0x6a, 0xa9, 0x06, 0x80, 0xa2, 0xb4, 0x6d, 0xfb, 0xfb, 0x07, 0x00,
+ 0x00, 0x04, 0x00, 0x84, 0x88, 0xc8, 0x99, 0xdd, 0xff, 0x3f, 0x00, 0x00,
+ 0xe0, 0x8b, 0xff, 0x96, 0x6a, 0xb6, 0x0a, 0xa0, 0x94, 0x96, 0x64, 0xdb,
+ 0xee, 0x07, 0x00, 0x00, 0x03, 0x08, 0x20, 0x60, 0x66, 0xec, 0xee, 0xb6,
+ 0x1d, 0x00, 0x00, 0xc0, 0x7e, 0xa5, 0xf4, 0xab, 0x55, 0x0d, 0x20, 0xe7,
+ 0xd4, 0x6d, 0xdb, 0xfb, 0x07, 0x00, 0x80, 0x00, 0x00, 0x09, 0x12, 0x33,
+ 0x67, 0x77, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xfa, 0xff, 0xb7, 0x7a, 0x55,
+ 0x19, 0x90, 0x91, 0xd4, 0x64, 0xdb, 0xee, 0x07, 0x00, 0x40, 0x00, 0x81,
+ 0x04, 0x88, 0x91, 0x3b, 0xbb, 0xfd, 0x0f, 0x00, 0x00, 0xc0, 0xab, 0xbf,
+ 0xed, 0x4e, 0xbb, 0x32, 0x20, 0x94, 0x96, 0x6c, 0xff, 0xfa, 0x03, 0x00,
+ 0x30, 0x40, 0x20, 0x20, 0x64, 0xcc, 0xdc, 0xdd, 0xff, 0x07, 0x00, 0x00,
+ 0xc0, 0xeb, 0xea, 0xfd, 0xd5, 0xaa, 0x2a, 0x20, 0xd7, 0xb0, 0x6d, 0x93,
+ 0xef, 0x07, 0x00, 0x08, 0x00, 0x08, 0x01, 0x23, 0xee, 0xee, 0xee, 0xfb,
+ 0x03, 0x00, 0x00, 0xc0, 0xfe, 0xff, 0x2d, 0xdd, 0x6a, 0x49, 0xd0, 0x90,
+ 0x9a, 0x64, 0xdf, 0xea, 0x07, 0x00, 0x03, 0x80, 0x40, 0x8c, 0x98, 0x33,
+ 0xb3, 0xbb, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xa5, 0x7b, 0x6d, 0xa7, 0x56,
+ 0xc5, 0xa0, 0x94, 0x94, 0x6f, 0xd3, 0xbb, 0x07, 0x80, 0x10, 0x0c, 0x12,
+ 0x40, 0xc6, 0xb9, 0xdb, 0xfb, 0xfd, 0x01, 0x00, 0x00, 0x80, 0x97, 0xee,
+ 0xdf, 0xba, 0x54, 0x1a, 0xa1, 0xe5, 0xd2, 0x64, 0x7e, 0xee, 0x07, 0x60,
+ 0x02, 0x80, 0x00, 0x31, 0x62, 0xcc, 0xdc, 0xee, 0x7f, 0x00, 0x00, 0x00,
+ 0x80, 0xff, 0xff, 0xdb, 0xaa, 0xb5, 0x8a, 0x86, 0x98, 0x96, 0x6d, 0x9b,
+ 0xea, 0x07, 0x98, 0x00, 0x22, 0x44, 0x88, 0x39, 0x77, 0x77, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x80, 0x7d, 0x77, 0xba, 0x7b, 0x2d, 0x55, 0x3c, 0xa6,
+ 0xb4, 0x6c, 0xf6, 0xaf, 0x07, 0x07, 0x90, 0x88, 0x20, 0x42, 0x9c, 0xbb,
+ 0xbb, 0xbb, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xbd, 0xbf, 0x55, 0x53,
+ 0xa5, 0xb2, 0xa1, 0xb4, 0xc9, 0x9f, 0xda, 0xcf, 0x28, 0x24, 0x42, 0x08,
+ 0x31, 0xe6, 0xcc, 0xdd, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef,
+ 0xb7, 0xbd, 0xde, 0x12, 0xd1, 0xac, 0x95, 0x4d, 0xf2, 0x56, 0x9f, 0x88,
+ 0x80, 0x10, 0xc2, 0x9c, 0x73, 0x77, 0xef, 0xfe, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0xbf, 0xfb, 0xed, 0xeb, 0x35, 0x95, 0x72, 0xa2, 0x35, 0xcd, 0xb6,
+ 0xd6, 0x2f, 0x21, 0x24, 0x04, 0x31, 0xc6, 0x98, 0x33, 0xf7, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xd6, 0x6a, 0x7f, 0x5b, 0xab, 0x2d, 0x28, 0x23,
+ 0x65, 0xd9, 0xb6, 0x55, 0x5f, 0x88, 0x08, 0x43, 0x0c, 0x61, 0xde, 0xdd,
+ 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, 0x4d, 0xd7, 0x4d,
+ 0x4a, 0xa5, 0x29, 0x2d, 0xdb, 0xbe, 0x55, 0x1f, 0x22, 0x42, 0x28, 0xc2,
+ 0x39, 0xe7, 0xee, 0xee, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x7f,
+ 0xfb, 0xb6, 0xb6, 0x95, 0x70, 0x2e, 0xa5, 0xd9, 0x24, 0x5d, 0x5f, 0x8a,
+ 0x28, 0x88, 0x31, 0x9e, 0x39, 0x73, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xec, 0xb7, 0xdf, 0x6c, 0xb5, 0x65, 0x26, 0xa3, 0x39, 0x9b, 0xfc,
+ 0x85, 0x5d, 0x21, 0x04, 0x63, 0x1c, 0xe6, 0xdd, 0xbd, 0xfb, 0xff, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0xb8, 0xfa, 0xb6, 0x6f, 0x4d, 0x9a, 0x28, 0x59,
+ 0x4d, 0xd3, 0x2f, 0xf5, 0x3f, 0x8c, 0xd1, 0x18, 0xc6, 0x31, 0xf6, 0xdd,
+ 0xfe, 0xff, 0xfe, 0x01, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xb9, 0xb6,
+ 0x25, 0xe1, 0x4d, 0x69, 0xba, 0x6c, 0xad, 0x3c, 0x41, 0x14, 0x84, 0xe9,
+ 0x9e, 0x37, 0xf7, 0xff, 0xff, 0xfb, 0x03, 0x00, 0x00, 0x00, 0x70, 0x5d,
+ 0x3d, 0x9f, 0x3d, 0x6d, 0x26, 0x52, 0x59, 0xb6, 0x6d, 0xab, 0x7f, 0x14,
+ 0x82, 0xe1, 0x39, 0xe6, 0xdd, 0xfb, 0xff, 0xbf, 0xff, 0x01, 0x00, 0x00,
+ 0x00, 0xf0, 0xf6, 0x6f, 0x77, 0xcd, 0x92, 0xd0, 0x52, 0x4b, 0xb3, 0x49,
+ 0x0b, 0x3a, 0x41, 0x61, 0x38, 0x9e, 0x73, 0xee, 0xdc, 0xff, 0xff, 0xfd,
+ 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xd7, 0x65, 0xda, 0x66, 0x63, 0x9d,
+ 0xf2, 0x36, 0x7b, 0x6a, 0x7f, 0x14, 0x18, 0x8e, 0xe7, 0xd9, 0x7b, 0xff,
+ 0xff, 0xef, 0xff, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xdd, 0xb6,
+ 0xc9, 0x4c, 0x46, 0x9a, 0x64, 0xcb, 0x5b, 0xed, 0x06, 0xc6, 0xe3, 0x71,
+ 0xde, 0xbd, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x00, 0x00, 0x00, 0xc0, 0x7f,
+ 0x7f, 0xff, 0x59, 0x37, 0x75, 0xbb, 0x96, 0x66, 0xdb, 0x56, 0xf7, 0xe0,
+ 0xf2, 0x74, 0x9e, 0x77, 0xef, 0xfd, 0xff, 0xeb, 0xed, 0x03, 0x00, 0x00,
+ 0x00, 0xc0, 0xea, 0xdf, 0xb3, 0xdb, 0xde, 0xc6, 0x81, 0xb0, 0x6c, 0xba,
+ 0xb4, 0xf6, 0x38, 0x18, 0x3c, 0xe7, 0x9c, 0xfb, 0xff, 0x7f, 0xff, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x80, 0xff, 0xf7, 0x6e, 0x66, 0xd9, 0x99, 0xac,
+ 0xa4, 0xcd, 0x96, 0xa5, 0xea, 0x03, 0xa7, 0xcf, 0x79, 0xef, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xef, 0xdf,
+ 0x6f, 0xef, 0x72, 0x65, 0xd9, 0xb6, 0xad, 0xe8, 0xc1, 0xe1, 0xf1, 0xbe,
+ 0x7b, 0xef, 0xff, 0xdf, 0x7a, 0xfb, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe,
+ 0x5f, 0xdd, 0x9d, 0xac, 0x99, 0x84, 0x29, 0xcd, 0x3c, 0x4f, 0x9d, 0x7d,
+ 0x3c, 0x9e, 0xe7, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xef, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xfe, 0xff, 0x77, 0x7b, 0x33, 0xe7, 0x5a, 0x49, 0x9b, 0x65,
+ 0x59, 0x75, 0x07, 0x97, 0xf7, 0xbb, 0xef, 0xff, 0xff, 0xdb, 0xfe, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf7, 0x3f, 0xe7, 0xcf, 0x9c, 0x51,
+ 0x4d, 0xb0, 0x6d, 0x4b, 0xc9, 0xd3, 0xf5, 0x79, 0xfe, 0xfb, 0xff, 0xff,
+ 0xdb, 0xda, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xde,
+ 0xdd, 0xf3, 0x4d, 0x52, 0x36, 0xcb, 0xd2, 0x3a, 0x7e, 0x3c, 0xde, 0xe7,
+ 0xbe, 0xff, 0x7f, 0xda, 0xff, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8,
+ 0xff, 0xfb, 0xdd, 0x73, 0x8f, 0xa5, 0x9a, 0xe6, 0xd9, 0xb6, 0xe2, 0x4e,
+ 0xc7, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xf6, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0xee, 0x79, 0xb2, 0xb2, 0x2c, 0x9f,
+ 0xb6, 0x54, 0xfe, 0xfb, 0x79, 0xbf, 0xff, 0xff, 0x5f, 0xda, 0xff, 0xfa,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xf7, 0xbf, 0xe7, 0x4b,
+ 0xb4, 0x69, 0xd3, 0x2c, 0x25, 0xbd, 0xbc, 0xcf, 0xf7, 0xfd, 0xff, 0xd7,
+ 0xf6, 0xfe, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0x9d,
+ 0xf1, 0x3e, 0x57, 0x25, 0xcb, 0xb6, 0x6d, 0xa9, 0xb5, 0xef, 0xfb, 0xff,
+ 0xff, 0xff, 0xd5, 0xda, 0xd6, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xfb, 0xcf, 0xf5, 0x25, 0x65, 0xd9, 0x66, 0x5b, 0x4a, 0xfa,
+ 0xf9, 0x7e, 0xff, 0xff, 0xff, 0xf6, 0xd6, 0xdf, 0xfa, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xef, 0x3e, 0xf7, 0x9f, 0x5b, 0x92, 0x6c,
+ 0xdb, 0x52, 0xe5, 0xbe, 0xdf, 0xff, 0xff, 0xbf, 0x51, 0xda, 0xfa, 0x7f,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7b, 0x9f, 0xe7,
+ 0x4c, 0xb3, 0x4d, 0xd3, 0x54, 0xd9, 0xe7, 0xfb, 0xff, 0xff, 0x5f, 0xdc,
+ 0xfa, 0xdf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f,
+ 0xe7, 0xf9, 0x3a, 0xd3, 0xa6, 0xe9, 0xb6, 0xa5, 0xca, 0xf9, 0xfd, 0xff,
+ 0xff, 0x83, 0x42, 0xd2, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xff, 0xfd, 0xbf, 0xef, 0x4f, 0xd5, 0x64, 0xdb, 0x26, 0x4d, 0x30,
+ 0x7f, 0xff, 0xff, 0xff, 0x91, 0xda, 0xdb, 0xda, 0xdf, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf, 0xff, 0x7d, 0xbe, 0xb5, 0x6d, 0x97,
+ 0x6d, 0x93, 0x56, 0xdf, 0xff, 0xff, 0x7f, 0x81, 0x4a, 0xda, 0x7f, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xef, 0xeb, 0xbb,
+ 0xa6, 0x4d, 0x73, 0xcd, 0x92, 0xaa, 0xfe, 0xff, 0xff, 0x1f, 0x01, 0x6a,
+ 0x5b, 0xfb, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xfd, 0xbf, 0x5f, 0x3b, 0xdb, 0x36, 0xbb, 0x26, 0x4c, 0xf9, 0xff, 0xff,
+ 0x0f, 0xa3, 0x2a, 0xe9, 0x7f, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xee, 0xff, 0xff, 0xfe, 0xfe, 0xcc, 0x91, 0xec, 0x93, 0x6d, 0x93,
+ 0xf2, 0xff, 0xff, 0x03, 0x00, 0x6a, 0x6d, 0x6f, 0xff, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x6f, 0x76, 0xb6, 0xcd,
+ 0x76, 0xc9, 0x2a, 0xe9, 0xff, 0xff, 0x00, 0x02, 0x24, 0xed, 0xf9, 0xed,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xdf, 0xff,
+ 0xd9, 0x66, 0x9b, 0x6c, 0x93, 0x54, 0xc5, 0xff, 0x3f, 0x00, 0x01, 0x95,
+ 0xb5, 0xaf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+ 0xff, 0xff, 0xfd, 0xae, 0x7d, 0xde, 0x6d, 0xf6, 0xa1, 0x8a, 0xff, 0x0f,
+ 0x00, 0x81, 0x90, 0xb4, 0xfd, 0xfd, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcd, 0xb2, 0xdb, 0x2c, 0xcb,
+ 0x54, 0xfe, 0x01, 0x00, 0x01, 0xd2, 0xb6, 0xb7, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x39, 0xdb, 0x76,
+ 0xb3, 0x4b, 0xb6, 0x0a, 0xfe, 0x00, 0x00, 0x01, 0x48, 0xda, 0xfe, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
+ 0xcf, 0xb9, 0x6d, 0xb6, 0xd9, 0xa5, 0x75, 0x1c, 0x00, 0x80, 0x80, 0x20,
+ 0xdb, 0xda, 0xbe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+ 0xff, 0xff, 0xff, 0x77, 0x96, 0xd9, 0x26, 0xb3, 0x4d, 0x82, 0x11, 0x00,
+ 0x80, 0x80, 0x24, 0x6d, 0xff, 0xf7, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xbb, 0x67, 0xdb, 0xdd, 0x36, 0xd9,
+ 0x54, 0x60, 0x00, 0xc0, 0x00, 0x92, 0x65, 0x6b, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x4f, 0x7d, 0x96,
+ 0xd9, 0x6c, 0x36, 0xad, 0xc2, 0x00, 0x60, 0x00, 0xc8, 0xb6, 0x6d, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+ 0xff, 0xc8, 0x76, 0xbb, 0xcb, 0x64, 0x52, 0x02, 0x03, 0x10, 0x00, 0x64,
+ 0xda, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xff, 0xff, 0x5f, 0xd7, 0x4d, 0x33, 0x99, 0xdd, 0x96, 0x04, 0x2c,
+ 0x1c, 0x40, 0x22, 0xdb, 0xb6, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xdf, 0xb5, 0xed, 0xe6, 0x36, 0x9b,
+ 0x6c, 0x29, 0xf0, 0x03, 0x00, 0x99, 0x6c, 0xfb, 0xfd, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x7f, 0x35, 0xbb,
+ 0xec, 0x76, 0x33, 0x91, 0x02, 0x00, 0x00, 0x00, 0x64, 0x67, 0xdf, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+ 0xbf, 0x6f, 0x9b, 0x9d, 0xc9, 0xce, 0x36, 0x49, 0x00, 0x00, 0x00, 0x93,
+ 0xb1, 0xdd, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0xff, 0x6a, 0x76, 0xbb, 0xdd, 0xd9, 0x64, 0x12, 0x01,
+ 0x00, 0x40, 0x98, 0xdd, 0x6d, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x66, 0x73, 0x33, 0xbb,
+ 0x9d, 0x4d, 0x00, 0x00, 0x00, 0x63, 0xe6, 0xf6, 0xff, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xed, 0xfd,
+ 0xee, 0xee, 0x36, 0x73, 0x2b, 0x04, 0x00, 0xa0, 0x38, 0x75, 0xbf, 0xff,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0xd9, 0xec, 0xce, 0x66, 0x66, 0x66, 0x22, 0x04, 0x00, 0xc6,
+ 0x99, 0xbb, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5e, 0xb3, 0xdb, 0xb9, 0xcd, 0xc9, 0x88, 0x89,
+ 0x00, 0x68, 0x31, 0xee, 0xdd, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xbe, 0xbb, 0x9b, 0x3f,
+ 0xbb, 0x33, 0x23, 0x04, 0x00, 0x8c, 0xf3, 0xee, 0xff, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x67,
+ 0x76, 0x77, 0xb2, 0x66, 0xce, 0x0c, 0xd1, 0xd6, 0xe3, 0x79, 0xf7, 0xff,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0xfd, 0xef, 0xe6, 0xee, 0xce, 0x9c, 0x31, 0x16, 0x00, 0x3c,
+ 0x9e, 0xfb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x9f, 0xdb, 0xdc, 0x9d, 0x99, 0x33, 0xc6,
+ 0xc1, 0xff, 0x8f, 0xe7, 0xbb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0xbd, 0xbb, 0x33,
+ 0x7b, 0xee, 0x18, 0x1e, 0x50, 0xf0, 0xf9, 0xfe, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7b,
+ 0xf7, 0x77, 0xf7, 0xe6, 0x9c, 0xe3, 0xf0, 0x4d, 0xff, 0x7c, 0xef, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0xdf, 0x76, 0x7f, 0xcf, 0x9e, 0x73, 0x8f, 0x07, 0xff, 0x0b,
+ 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0xee, 0xcd, 0xdd, 0x9d, 0x7b, 0xf7, 0x7c,
+ 0x7a, 0x00, 0xf0, 0xe7, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0xbf, 0xdd, 0x7b,
+ 0x6b, 0x9e, 0xf3, 0xe1, 0xff, 0xff, 0x7d, 0xff, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee,
+ 0xb7, 0xbb, 0x7b, 0xee, 0x79, 0x8f, 0x0f, 0xfa, 0x2f, 0xff, 0xf7, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0xff, 0x77, 0xef, 0xdd, 0x77, 0x7c, 0xfe, 0x02, 0xe8,
+ 0xcf, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xef, 0xee, 0xdd, 0xb3, 0xcf, 0xf3,
+ 0xf1, 0xff, 0xff, 0xf9, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfb, 0xff, 0xbf,
+ 0xef, 0xbe, 0xcf, 0x8f, 0xfe, 0x5f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+ 0xbf, 0xbb, 0xf7, 0xde, 0x79, 0x3e, 0xff, 0x52, 0xd2, 0xdf, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0xef, 0xef, 0xef, 0x3c, 0xef, 0xf9, 0xf8, 0xff, 0xff,
+ 0xf7, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xee, 0xdc, 0xf7, 0xfe, 0xe7,
+ 0x97, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf,
+ 0xef, 0xbf, 0x3e, 0xff, 0xda, 0xf6, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfe, 0xbf, 0xf7, 0xfe, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xde, 0xbd, 0xef, 0xfb, 0xd7, 0xff, 0xbf,
+ 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x7d, 0xbf,
+ 0xff, 0xd2, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf,
+ 0xef, 0xfb, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0xff, 0xef, 0xbe, 0xf7, 0xef, 0xef, 0xff, 0xff, 0xff, 0x3f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xdf, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+ 0xfe, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+# define GCBits (GCFillStyle|GCTileStipXOrigin|GCTileStipYOrigin)
+
+void SetFillStyle(xp, p)
+ XParms xp;
+ Parms p;
+{
+ int xorg = 0, yorg = 0;
+
+ if (p->fillStyle == FillStippled || p->fillStyle == FillOpaqueStippled) {
+ Pixmap stipple;
+ XGCValues gcv;
+
+ if (!p->font) {
+ /* Little 8x8 stipple */
+ stipple = XCreateBitmapFromData(xp->d, xp->w, (char *)bitmap8x8, 8, 8);
+ } else if (!strcmp (p->font, "escherknot")) {
+ /* Enormous stipple which is x4 bits wide */
+ stipple = XCreateBitmapFromData(xp->d, xp->w,
+ (char *)escherknot_bits, escherknot_width, escherknot_height);
+ xorg = -3;
+ } else if (!strcmp (p->font, "OddTile")) {
+ /* Odd sized tile */
+ stipple = XCreateBitmapFromData(xp->d, xp->w,
+ (char *)oddbit_bits, oddbit_width, oddbit_height);
+ } else {
+ /* Enormous stipple. Well, pretty big. */
+ stipple = XCreateBitmapFromData(xp->d, xp->w,
+ (char *)mensetmanus_bits, mensetmanus_width, mensetmanus_height);
+ }
+
+ gcv.stipple = stipple;
+ gcv.fill_style = p->fillStyle;
+ gcv.ts_x_origin = xorg;
+ gcv.ts_y_origin = yorg;
+ XChangeGC(xp->d, xp->fggc, GCBits | GCStipple, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCBits | GCStipple, &gcv);
+ XFreePixmap(xp->d, stipple);
+
+ } else if (p->fillStyle == FillTiled) {
+ Pixmap tile;
+ XGCValues gcv;
+
+ gcv.fill_style = FillTiled;
+ if (!p->font) {
+ /* Little 4x4 tile */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w, (char *)bitmap4x4, 4, 4,
+ xp->foreground, xp->background, xp->vinfo.depth);
+ } else if (!strcmp (p->font, "escherknot")) {
+ /* Enormous stipple which is x4 bits wide */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)escherknot_bits, escherknot_width, escherknot_height,
+ xp->foreground, xp->background, xp->vinfo.depth);
+ /* align tile with screen */
+ xorg = -3;
+ } else if (!strcmp (p->font, "OddTile")) {
+ /* Odd sized tile */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)oddbit_bits, oddbit_width, oddbit_height,
+ xp->foreground, xp->background, xp->vinfo.depth);
+ /* align tile with screen */
+ } else {
+ /* Enormous tile. Well, pretty big. */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)mensetmanus_bits, mensetmanus_width, mensetmanus_height,
+ xp->foreground, xp->background, xp->vinfo.depth);
+ }
+ gcv.tile = tile;
+ gcv.ts_x_origin = xorg;
+ gcv.ts_y_origin = yorg;
+ XChangeGC(xp->d, xp->fggc, GCBits | GCTile, &gcv);
+ XFreePixmap(xp->d, tile);
+ if (!p->font) {
+ /* Little 4x4 tile */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w, (char *)bitmap4x4, 4, 4,
+ xp->background, xp->foreground, xp->vinfo.depth);
+ } else if (!strcmp (p->font, "escherknot")) {
+ /* Enormous stipple which is x4 bits wide */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)escherknot_bits, escherknot_width, escherknot_height,
+ xp->background, xp->foreground, xp->vinfo.depth);
+ } else if (!strcmp (p->font, "OddTile")) {
+ /* Odd sized tile */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)oddbit_bits, oddbit_width, oddbit_height,
+ xp->background, xp->foreground, xp->vinfo.depth);
+ } else {
+ /* Enormous tile. Well, pretty big. */
+ tile = XCreatePixmapFromBitmapData(xp->d, xp->w,
+ (char *)mensetmanus_bits, mensetmanus_width, mensetmanus_height,
+ xp->background, xp->foreground, xp->vinfo.depth);
+ }
+ gcv.tile = tile;
+ XChangeGC(xp->d, xp->bggc, GCFillStyle | GCTile, &gcv);
+ XFreePixmap(xp->d, tile);
+ }
+}
diff --git a/bitmaps.h b/bitmaps.h
new file mode 100644
index 0000000..50555b2
--- /dev/null
+++ b/bitmaps.h
@@ -0,0 +1,31 @@
+/* $Xorg: bitmaps.h,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+/* Set fill style (if any) to a bitmap or tile */
+
+extern void SetFillStyle(/* xp, p */);
+/*
+ XParms xp;
+ Parms p;
+*/
diff --git a/do_arcs.c b/do_arcs.c
new file mode 100644
index 0000000..a55eb91
--- /dev/null
+++ b/do_arcs.c
@@ -0,0 +1,555 @@
+/* $Xorg: do_arcs.c,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static XArc *arcs;
+static GC pgc;
+
+#define DegreesToX(degrees) (degrees * 64)
+
+static void GenerateCircles(xp, p, partialArcs, ddashed)
+ XParms xp;
+ Parms p;
+ Bool partialArcs;
+ Bool ddashed;
+{
+ int i;
+ int rows; /* Number of rows filled in current column */
+ int x, y; /* base of square to draw the circle in */
+ int xorg, yorg; /* Used to get from column to column or row to row */
+ int size;
+ int half;
+ int startAngle, arcAngle;
+
+ if(ddashed)
+ pgc = xp->ddfggc;
+ else
+ pgc = xp->fggc;
+
+ size = p->special;
+ half = (size + 19) / 20;
+ arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
+ x = xorg = half; y = yorg = half;
+ rows = 0;
+ startAngle = DegreesToX(0);
+ arcAngle = DegreesToX(360);
+
+ for (i = 0; i != p->objects; i++) {
+ arcs[i].x = x;
+ arcs[i].y = y;
+ arcs[i].width = size;
+ arcs[i].height = size;
+ arcs[i].angle1 = startAngle;
+ arcs[i].angle2 = arcAngle;
+
+ if (partialArcs) {
+ startAngle += DegreesToX(30);
+ if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
+ arcAngle -= DegreesToX(20);
+ if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
+ }
+
+ y += size + 1;
+ rows++;
+ if (y >= HEIGHT - size - half || rows == MAXROWS) {
+ /* Go to next column */
+ rows = 0;
+ x += size + 1;
+ if (x >= WIDTH - size) {
+ yorg++;
+ if (yorg >= size + half || yorg >= HEIGHT - size - half) {
+ yorg = half;
+ xorg++;
+ if (xorg >= size + half || xorg >= WIDTH - size - half) {
+ xorg = half;
+ }
+ }
+ x = xorg;
+ }
+ y = yorg;
+ }
+ }
+}
+
+int InitCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateCircles(xp, p, False, False);
+ return reps;
+}
+
+int InitPartCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateCircles(xp, p, True, False);
+ return reps;
+}
+
+
+int InitChordPartCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateCircles(xp, p, True, False);
+ XSetArcMode(xp->d, xp->bggc, ArcChord);
+ XSetArcMode(xp->d, xp->fggc, ArcChord);
+ return reps;
+}
+
+
+int InitSlicePartCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateCircles(xp, p, True, False);
+ XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
+ XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
+ return reps;
+}
+
+static void
+GenerateWideCircles (xp, p, partialArcs, ddashed)
+ XParms xp;
+ Parms p;
+ Bool partialArcs;
+ Bool ddashed;
+{
+ int size;
+
+ GenerateCircles(xp, p, partialArcs, ddashed);
+
+ size = p->special;
+ if(ddashed) {
+ XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+ else {
+ XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+}
+
+int InitWideCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateWideCircles (xp, p, False, False);
+ return reps;
+}
+
+int InitPartWideCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateWideCircles (xp, p, True, False);
+ return reps;
+}
+
+int InitDashedCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateCircles(xp, p, False, False);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDashedCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ GenerateWideCircles(xp, p, False, False);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineOnOffDash;
+ XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitDoubleDashedCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateCircles(xp, p, False, True);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDoubleDashedCircles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ GenerateWideCircles(xp, p, False, True);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineDoubleDash;
+ XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+static void GenerateEllipses(xp, p, partialArcs, ddashed)
+ XParms xp;
+ Parms p;
+ int partialArcs;
+ Bool ddashed;
+{
+ int size;
+ int half;
+ int rows; /* Number of rows filled in current column */
+ int i;
+ int x, y; /* base of square to draw ellipse in */
+ int vsize, vsizeinc;
+ int dir;
+ int startAngle, arcAngle;
+
+ if(ddashed)
+ pgc = xp->ddfggc;
+ else
+ pgc = xp->fggc;
+
+ size = p->special;
+ half = (size + 19) / 20;
+ arcs = (XArc *)malloc((p->objects) * sizeof(XArc));
+ vsize = 1;
+ vsizeinc = (size - 1) / (p->objects - 1);
+ if (vsizeinc == 0) vsizeinc = 1;
+
+ x = half; y = half;
+ dir = 0;
+ rows = 0;
+ startAngle = DegreesToX(0);
+ arcAngle = DegreesToX(360);
+
+ for (i = 0; i != p->objects; i++) {
+ arcs[i].x = x;
+ arcs[i].y = y;
+ if ((i & 1) ^ dir) {
+ /* Make vertical axis longer */
+ arcs[i].width = vsize;
+ arcs[i].height = size;
+ } else {
+ /* Make horizontal axis longer */
+ arcs[i].width = size;
+ arcs[i].height = vsize;
+ }
+ arcs[i].angle1 = startAngle;
+ arcs[i].angle2 = arcAngle;
+
+ if (partialArcs) {
+ startAngle += DegreesToX(30);
+ if (startAngle >= DegreesToX(360)) startAngle -= DegreesToX(360);
+ arcAngle -= DegreesToX(20);
+ if (arcAngle <= DegreesToX(0)) arcAngle += DegreesToX(360);
+ }
+
+ y += size + 1;
+ rows++;
+ if (y >= HEIGHT - size - half || rows == MAXROWS) {
+ /* Go to next column */
+ rows = 0;
+ y = half;
+ x += size + 1;
+ if (x >= WIDTH - size - half) {
+ x = half;
+ }
+ }
+
+ vsize += vsizeinc;
+ if (vsize > size) {
+ vsize -= size;
+ dir = 1 - dir;
+ }
+ }
+}
+
+int InitEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateEllipses(xp, p, False, False);
+ return reps;
+}
+
+
+int InitPartEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateEllipses(xp, p, True, False);
+ return reps;
+}
+
+
+int InitChordPartEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateEllipses(xp, p, True, False);
+ XSetArcMode(xp->d, xp->bggc, ArcChord);
+ XSetArcMode(xp->d, xp->fggc, ArcChord);
+ return reps;
+}
+
+
+int InitSlicePartEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateEllipses(xp, p, True, False);
+ XSetArcMode(xp->d, xp->bggc, ArcPieSlice);
+ XSetArcMode(xp->d, xp->fggc, ArcPieSlice);
+ return reps;
+}
+
+
+static void
+GenerateWideEllipses (xp, p, partialArcs, ddashed)
+ XParms xp;
+ Parms p;
+ Bool partialArcs;
+ Bool ddashed;
+{
+ int size;
+
+ GenerateEllipses (xp, p, partialArcs, ddashed);
+ size = p->special;
+ if(ddashed) {
+ XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+ else {
+ XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+
+}
+
+int InitWideEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateWideEllipses(xp, p, False, False);
+ return reps;
+}
+
+int InitPartWideEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateWideEllipses(xp, p, True, False);
+ return reps;
+}
+
+int InitDashedEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateEllipses(xp, p, False, False);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDashedEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ GenerateWideEllipses(xp, p, False, False);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineOnOffDash;
+ XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitDoubleDashedEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateEllipses(xp, p, False, True);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDoubleDashedEllipses(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ GenerateWideEllipses(xp, p, False, True);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineDoubleDash;
+ XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+void DoArcs(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XDrawArcs(xp->d, xp->w, pgc, arcs, p->objects);
+ if (pgc == xp->ddbggc)
+ pgc = xp->ddfggc;
+ else if(pgc == xp->ddfggc)
+ pgc = xp->ddbggc;
+ else if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void DoFilledArcs(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XFillArcs(xp->d, xp->w, pgc, arcs, p->objects);
+ if (pgc == xp->ddbggc)
+ pgc = xp->ddfggc;
+ else if(pgc == xp->ddfggc)
+ pgc = xp->ddbggc;
+ else if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndArcs(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(arcs);
+}
+
diff --git a/do_blt.c b/do_blt.c
new file mode 100644
index 0000000..5182816
--- /dev/null
+++ b/do_blt.c
@@ -0,0 +1,594 @@
+/* $Xorg: do_blt.c,v 1.4 2000/11/30 12:16:31 pookie 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+#include <stdio.h>
+
+#define NUMPOINTS 100
+
+static Pixmap pix;
+static XImage *image;
+static XPoint points[NUMPOINTS];
+static XSegment *segsa, *segsb;
+
+#define NegMod(x, y) ((y) - (((-x)-1) % (7)) - 1)
+
+void InitBltLines()
+{
+ int i, x, y;
+
+ points[0].x = points[0].y = y = 0;
+ for (i = 1; i != NUMPOINTS/2; i++) {
+ if (i & 1) {
+ points[i].x = WIDTH-1;
+ } else {
+ points[i].x = 0;
+ }
+ y += HEIGHT / (NUMPOINTS/2);
+ points[i].y = y;
+ }
+
+ x = 0;
+ for (i = NUMPOINTS/2; i!= NUMPOINTS; i++) {
+ if (i & 1) {
+ points[i].y = HEIGHT-1;
+ } else {
+ points[i].y = 0;
+ }
+ x += WIDTH / (NUMPOINTS/2);
+ points[i].x = x;
+ }
+}
+
+int InitScroll(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ InitBltLines();
+ XDrawLines(xp->d, xp->w, xp->fggc, points, NUMPOINTS, CoordModeOrigin);
+ return reps;
+}
+
+void DoScroll(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, size, x, y, xorg, yorg, delta;
+
+ size = p->special;
+ xorg = 0; yorg = 0;
+ x = 0; y = 0;
+ if (xp->version == VERSION1_2) {
+ delta = 1;
+ } else {
+ /* Version 1.2 only scrolled up by 1 scanline, which made hardware
+ using page-mode access to VRAM look better on paper than it would
+ perform in a more realistic scroll. So we've changed to scroll by
+ the height of the 6x13 fonts. */
+ delta = 13;
+ }
+
+ for (i = 0; i != reps; i++) {
+ XCopyArea(xp->d, xp->w, xp->w, xp->fggc, x, y + delta,
+ size, size, x, y);
+ y += size;
+ if (y + size + delta > HEIGHT) {
+ yorg += delta;
+ if (yorg >= size || yorg + size + delta > HEIGHT) {
+ yorg = 0;
+ xorg++;
+ if (xorg >= size || xorg + size > WIDTH) {
+ xorg = 0;
+ }
+ }
+ y = yorg;
+ x += size;
+ if (x + size > WIDTH) {
+ x = xorg;
+ }
+ }
+ }
+}
+
+void MidScroll(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XClearWindow(xp->d, xp->w);
+ XDrawLines(xp->d, xp->w, xp->fggc, points, NUMPOINTS, CoordModeOrigin);
+}
+
+void EndScroll(xp, p)
+ XParms xp;
+ Parms p;
+{
+}
+
+static void InitCopyLocations(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int x1, y1, x2, y2, size, i;
+ int xinc, yinc;
+ int width, height;
+
+ /* Try to exercise all alignments of src and destination equally, as well
+ as all 4 top-to-bottom/bottom-to-top, left-to-right, right-to-left
+ copying directions. Computation done here just to make sure slow
+ machines aren't measuring anything but the XCopyArea calls.
+ */
+ size = p->special;
+ xinc = (size & ~3) + 1;
+ yinc = xinc + 3;
+
+ width = (WIDTH - size) & ~31;
+ height = (HEIGHT - size) & ~31;
+
+ x1 = 0;
+ y1 = 0;
+ x2 = width;
+ y2 = height;
+
+ segsa = (XSegment *)malloc(reps * sizeof(XSegment));
+ segsb = (XSegment *)malloc(reps * sizeof(XSegment));
+ for (i = 0; i != reps; i++) {
+ segsa[i].x1 = x1;
+ segsa[i].y1 = y1;
+ segsa[i].x2 = x2;
+ segsa[i].y2 = y2;
+
+ /* Move x2, y2, location backward */
+ x2 -= xinc;
+ if (x2 < 0) {
+ x2 = NegMod(x2, width);
+ y2 -= yinc;
+ if (y2 < 0) {
+ y2 = NegMod(y2, height);
+ }
+ }
+
+ segsb[i].x1 = x1;
+ segsb[i].y1 = y1;
+ segsb[i].x2 = x2;
+ segsb[i].y2 = y2;
+
+ /* Move x1, y1 location forward */
+ x1 += xinc;
+ if (x1 > width) {
+ x1 %= 32;
+ y1 += yinc;
+ if (y1 > height) {
+ y1 %= 32;
+ }
+ }
+ } /* end for */
+}
+
+
+int InitCopyWin(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ (void) InitScroll(xp, p, reps);
+ InitCopyLocations(xp, p, reps);
+ return reps;
+}
+
+int InitCopyPix(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GC pixgc;
+ (void) InitCopyWin(xp, p, reps);
+
+ /* Create pixmap to write stuff into, and initialize it */
+ pix = XCreatePixmap(xp->d, xp->w, WIDTH, HEIGHT, xp->vinfo.depth);
+ pixgc = XCreateGC(xp->d, pix, 0, 0);
+ /* need a gc with GXcopy cos pixmaps contain junk on creation. mmm */
+ XCopyArea(xp->d, xp->w, pix, pixgc, 0, 0, WIDTH, HEIGHT, 0, 0);
+ XFreeGC(xp->d, pixgc);
+ return reps;
+}
+
+Bool InitGetImage(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ (void) InitCopyWin(xp, p, reps);
+
+ /* Create image to stuff bits into */
+ image = XGetImage(xp->d, xp->w, 0, 0, WIDTH, HEIGHT, xp->planemask,
+ p->font==0?ZPixmap:XYPixmap);
+ if(image==0){
+ printf("XGetImage failed\n");
+ return False;
+ }
+ return reps;
+}
+
+Bool InitPutImage(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ if(!InitGetImage(xp, p, reps))return False;
+ XClearWindow(xp->d, xp->w);
+ return reps;
+}
+
+static void CopyArea(xp, p, reps, src, dst)
+ XParms xp;
+ Parms p;
+ int reps;
+ Drawable src, dst;
+{
+ int i, size;
+ XSegment *sa, *sb;
+
+ size = p->special;
+ for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) {
+ XCopyArea(xp->d, src, dst, xp->fggc,
+ sa->x1, sa->y1, size, size, sa->x2, sa->y2);
+ XCopyArea(xp->d, src, dst, xp->fggc,
+ sa->x2, sa->y2, size, size, sa->x1, sa->y1);
+ XCopyArea(xp->d, src, dst, xp->fggc,
+ sb->x2, sb->y2, size, size, sb->x1, sb->y1);
+ XCopyArea(xp->d, src, dst, xp->fggc,
+ sb->x1, sb->y1, size, size, sb->x2, sb->y2);
+ }
+}
+
+void DoCopyWinWin(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ CopyArea(xp, p, reps, xp->w, xp->w);
+}
+
+void DoCopyPixWin(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ CopyArea(xp, p, reps, pix, xp->w);
+}
+
+void DoCopyWinPix(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ CopyArea(xp, p, reps, xp->w, pix);
+ xp->p = pix; /* HardwareSync will now sync on pixmap */
+}
+
+void DoCopyPixPix(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ CopyArea(xp, p, reps, pix, pix);
+ xp->p = pix; /* HardwareSync will now sync on pixmap */
+}
+
+void DoGetImage(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, size;
+ XSegment *sa, *sb;
+ int format;
+
+ size = p->special;
+ format = (p->font == 0) ? ZPixmap : XYPixmap;
+ for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) {
+ XDestroyImage(image);
+ image = XGetImage(xp->d, xp->w, sa->x1, sa->y1, size, size,
+ xp->planemask, format);
+ if (image) XDestroyImage(image);
+ image = XGetImage(xp->d, xp->w, sa->x2, sa->y2, size, size,
+ xp->planemask, format);
+ if (image) XDestroyImage(image);
+ image = XGetImage(xp->d, xp->w, sb->x2, sb->y2, size, size,
+ xp->planemask, format);
+ if (image) XDestroyImage(image);
+ image = XGetImage(xp->d, xp->w, sb->x1, sb->y1, size, size,
+ xp->planemask, format);
+/*
+
+One might expect XGetSubImage to be slightly faster than XGetImage. Go look
+at the code in Xlib. MIT X11R3 ran approximately 30 times slower for a 500x500
+rectangle.
+
+ (void) XGetSubImage(xp->d, xp->w, sa->x1, sa->y1, size, size,
+ xp->planemask, ZPixmap, image, sa->x2, sa->y2);
+ (void) XGetSubImage(xp->d, xp->w, sa->x2, sa->y2, size, size,
+ xp->planemask, ZPixmap, image, sa->x1, sa->y1);
+ (void) XGetSubImage(xp->d, xp->w, sb->x2, sb->y2, size, size,
+ xp->planemask, ZPixmap, image, sb->x2, sb->y2);
+ (void) XGetSubImage(xp->d, xp->w, sb->x1, sb->y1, size, size,
+ xp->planemask, ZPixmap, image, sb->x2, sb->y2);
+*/
+ }
+}
+
+void DoPutImage(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, size;
+ XSegment *sa, *sb;
+
+ size = p->special;
+ for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) {
+ XPutImage(xp->d, xp->w, xp->fggc, image,
+ sa->x1, sa->y1, sa->x2, sa->y2, size, size);
+ XPutImage(xp->d, xp->w, xp->fggc, image,
+ sa->x2, sa->y2, sa->x1, sa->y1, size, size);
+ XPutImage(xp->d, xp->w, xp->fggc, image,
+ sb->x2, sb->y2, sb->x2, sb->y2, size, size);
+ XPutImage(xp->d, xp->w, xp->fggc, image,
+ sb->x1, sb->y1, sb->x2, sb->y2, size, size);
+ }
+}
+
+#ifdef MITSHM
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/extensions/XShm.h>
+
+static XImage shm_image;
+static XShmSegmentInfo shm_info;
+
+static int haderror;
+static int (*origerrorhandler)();
+shmerrorhandler(d,e)
+Display *d;
+XErrorEvent *e;
+{
+ haderror++;
+ if(e->error_code==BadAccess)fprintf(stderr,"failed to attach shared memory\n");
+ else (*origerrorhandler)(d,e);
+}
+int InitShmPutImage (xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int image_size;
+
+ if(!InitGetImage(xp, p, reps))return False;
+ if (!XShmQueryExtension(xp->d)) {
+ /*
+ * Clean up here because cleanup function is not called if this
+ * function fails
+ */
+ if (image)
+ XDestroyImage(image);
+ image = NULL;
+ free(segsa);
+ free(segsb);
+ return False;
+ }
+ XClearWindow(xp->d, xp->w);
+ shm_image = *image;
+ image_size = image->bytes_per_line * image->height;
+ /* allow XYPixmap choice: */
+ if(p->font)image_size *= xp->vinfo.depth;
+ shm_info.shmid = shmget(IPC_PRIVATE, image_size, IPC_CREAT|0777);
+ if (shm_info.shmid < 0)
+ {
+ /*
+ * Clean up here because cleanup function is not called if this
+ * function fails
+ */
+ if (image)
+ XDestroyImage(image);
+ image = NULL;
+ free(segsa);
+ free(segsb);
+ perror ("shmget");
+ return False;
+ }
+ shm_info.shmaddr = (char *) shmat(shm_info.shmid, 0, 0);
+ if (shm_info.shmaddr == ((char *) -1))
+ {
+ /*
+ * Clean up here because cleanup function is not called if this
+ * function fails
+ */
+ if (image)
+ XDestroyImage(image);
+ image = NULL;
+ free(segsa);
+ free(segsb);
+ perror ("shmat");
+ shmctl (shm_info.shmid, IPC_RMID, 0);
+ return False;
+ }
+ shm_info.readOnly = True;
+ XSync(xp->d,True);
+ haderror = False;
+ origerrorhandler = XSetErrorHandler(shmerrorhandler);
+ XShmAttach (xp->d, &shm_info);
+ XSync(xp->d,True); /* wait for error or ok */
+ XSetErrorHandler(origerrorhandler);
+ if(haderror){
+ /*
+ * Clean up here because cleanup function is not called if this
+ * function fails
+ */
+ if (image)
+ XDestroyImage(image);
+ image = NULL;
+ free(segsa);
+ free(segsb);
+ if(shmdt (shm_info.shmaddr)==-1)
+ perror("shmdt:");
+ if(shmctl (shm_info.shmid, IPC_RMID, 0)==-1)
+ perror("shmctl rmid:");
+ return False;
+ }
+ shm_image.data = shm_info.shmaddr;
+ memmove( shm_image.data, image->data, image_size);
+ shm_image.obdata = (char *) &shm_info;
+ return reps;
+}
+
+void DoShmPutImage(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, size;
+ XSegment *sa, *sb;
+
+ size = p->special;
+ for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) {
+ XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image,
+ sa->x1, sa->y1, sa->x2, sa->y2, size, size, False);
+ XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image,
+ sa->x2, sa->y2, sa->x1, sa->y1, size, size, False);
+ XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image,
+ sb->x2, sb->y2, sb->x2, sb->y2, size, size, False);
+ XShmPutImage(xp->d, xp->w, xp->fggc, &shm_image,
+ sb->x1, sb->y1, sb->x2, sb->y2, size, size, False);
+ }
+}
+
+void EndShmPutImage(xp, p)
+ XParms xp;
+ Parms p;
+{
+ void EndGetImage();
+
+ EndGetImage (xp, p);
+ XShmDetach (xp->d, &shm_info);
+ XSync(xp->d, False); /* need server to detach so can remove id */
+ if(shmdt (shm_info.shmaddr)==-1)
+ perror("shmdt:");
+ if(shmctl (shm_info.shmid, IPC_RMID, 0)==-1)
+ perror("shmctl rmid:");
+}
+
+#endif
+
+
+void MidCopyPix(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XClearWindow(xp->d, xp->w);
+}
+
+void EndCopyWin(xp, p)
+ XParms xp;
+ Parms p;
+{
+ EndScroll(xp, p);
+ free(segsa);
+ free(segsb);
+}
+
+void EndCopyPix(xp, p)
+ XParms xp;
+ Parms p;
+{
+ EndCopyWin(xp, p);
+ XFreePixmap(xp->d, pix);
+ /*
+ * Ensure that the next test doesn't try and sync on the pixmap
+ */
+ xp->p = (Pixmap)0;
+}
+
+void EndGetImage(xp, p)
+ XParms xp;
+ Parms p;
+{
+ EndCopyWin(xp, p);
+ if (image) XDestroyImage(image);
+}
+
+Bool InitCopyPlane(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ XGCValues gcv;
+ GC pixgc;
+
+ InitBltLines();
+ InitCopyLocations(xp, p, reps);
+
+ /* Create pixmap to write stuff into, and initialize it */
+ pix = XCreatePixmap(xp->d, xp->w, WIDTH, HEIGHT,
+ p->font==0 ? 1 : xp->vinfo.depth);
+ gcv.graphics_exposures = False;
+ gcv.foreground = 0;
+ gcv.background = 1;
+ pixgc = XCreateGC(xp->d, pix,
+ GCForeground | GCBackground | GCGraphicsExposures, &gcv);
+ XFillRectangle(xp->d, pix, pixgc, 0, 0, WIDTH, HEIGHT);
+ gcv.foreground = 1;
+ gcv.background = 0;
+ XChangeGC(xp->d, pixgc, GCForeground | GCBackground, &gcv);
+ XDrawLines(xp->d, pix, pixgc, points, NUMPOINTS, CoordModeOrigin);
+ XFreeGC(xp->d, pixgc);
+
+ return reps;
+}
+
+void DoCopyPlane(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, size;
+ XSegment *sa, *sb;
+
+ size = p->special;
+ for (sa = segsa, sb = segsb, i = 0; i != reps; i++, sa++, sb++) {
+ XCopyPlane(xp->d, pix, xp->w, xp->fggc,
+ sa->x1, sa->y1, size, size, sa->x2, sa->y2, 1);
+ XCopyPlane(xp->d, pix, xp->w, xp->fggc,
+ sa->x2, sa->y2, size, size, sa->x1, sa->y1, 1);
+ XCopyPlane(xp->d, pix, xp->w, xp->fggc,
+ sb->x2, sb->y2, size, size, sb->x1, sb->y1, 1);
+ XCopyPlane(xp->d, pix, xp->w, xp->fggc,
+ sb->x1, sb->y1, size, size, sb->x2, sb->y2, 1);
+ }
+}
+
diff --git a/do_complex.c b/do_complex.c
new file mode 100644
index 0000000..c1ef532
--- /dev/null
+++ b/do_complex.c
@@ -0,0 +1,201 @@
+/* $Xorg: do_complex.c,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+#define NUM_POINTS 4 /* 4 points to an arrowhead */
+#define NUM_ANGLES 3 /* But mostly it looks like a triangle */
+static XPoint *points;
+static GC pgc;
+
+extern double sin();
+extern double cos();
+extern double tan();
+extern double sqrt();
+#define PI 3.14159265357989
+
+int InitComplexPoly(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j, numPoints;
+ int x, y;
+ int size, iradius;
+ double phi, phiinc, radius, delta, phi2;
+ XPoint *curPoint;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ phi = 0.0;
+ delta = 2.0 * PI / ((double) NUM_ANGLES);
+ if (xp->version == VERSION1_2) {
+ radius = ((double) size) * sqrt(3.0)/2.0;
+ phiinc = delta/10.0;
+ } else {
+ /* Version 1.2's radius computation was completely bogus, and resulted
+ in triangles with sides about 50% longer than advertised. Since
+ in version 1.3 triangles are scaled to cover size^2 pixels, we do
+ the same computation here. The arrowheads are a little larger than
+ simple triangles, because they lose 1/3 of their area due to the
+ notch cut out from them, so radius has to be sqrt(3/2) larger than
+ for simple triangles.
+ */
+ radius = ((double) size) * sqrt(sqrt(4.0/3.0));
+ phiinc = 1.75*PI / ((double) p->objects);
+ }
+ iradius = (int) radius + 1;
+
+ numPoints = (p->objects) * NUM_POINTS;
+ points = (XPoint *)malloc(numPoints * sizeof(XPoint));
+ curPoint = points;
+ x = iradius;
+ y = iradius;
+ for (i = 0; i != p->objects; i++) {
+ for (j = 0; j != NUM_ANGLES; j++) {
+ phi2 = phi + ((double) j) * delta;
+ curPoint->x = (int) ((double)x + (radius * cos(phi2)) + 0.5);
+ curPoint->y = (int) ((double)y + (radius * sin(phi2)) + 0.5);
+ curPoint++;
+ }
+ curPoint->x = x;
+ curPoint->y = y;
+ curPoint++;
+
+ phi += phiinc;
+ y += 2 * iradius;
+ if (y + iradius >= HEIGHT) {
+ y = iradius;
+ x += 2 * iradius;
+ if (x + iradius >= WIDTH) {
+ x = iradius;
+ }
+ }
+ }
+ return reps;
+}
+
+void DoComplexPoly(xp, p, reps)
+ 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, Complex,
+ CoordModeOrigin);
+ curPoint += NUM_POINTS;
+ }
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndComplexPoly(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(points);
+}
+
+int InitGeneralPoly (xp,p,reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j, numPoints;
+ int nsides;
+ int x, y;
+ int size, iradius;
+ double phi, phiinc, inner_radius, outer_radius, delta, phi2;
+ XPoint *curPoint;
+
+ pgc = xp->fggc;
+ size = p->special;
+ nsides = (int) p->font;
+ phi = 0.0;
+ delta = 2.0 * PI / ((double) nsides);
+ phiinc = delta / 10.0;
+
+ inner_radius = size / sqrt (nsides * tan (PI / nsides));
+ outer_radius = inner_radius / cos (PI / (2 * nsides));
+ numPoints = p->objects * nsides;
+ points = (XPoint *) malloc (numPoints * sizeof (XPoint));
+ curPoint = points;
+ iradius = outer_radius + 1;
+ x = iradius;
+ y = iradius;
+ for (i = 0; i < p->objects; i++) {
+ phi2 = phi;
+ for (j = 0; j < nsides; j++) {
+ curPoint->x = x + (outer_radius * cos(phi2) + 0.5);
+ curPoint->y = y + (outer_radius * sin(phi2) + 0.5);
+ curPoint++;
+ phi2 += delta;
+ }
+ phi += phiinc;
+ y += 2 * iradius;
+ if (y + iradius >= HEIGHT) {
+ y = iradius;
+ x += 2 * iradius;
+ if (x + iradius >= WIDTH) {
+ x = iradius;
+ }
+ }
+ }
+ return reps;
+}
+
+void DoGeneralPoly(xp,p,reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j;
+ int nsides;
+ int mode;
+ XPoint *curPoint;
+
+ nsides = (int) p->font;
+ mode = (int) p->bfont;
+ for (i = 0; i != reps; i++) {
+ curPoint = points;
+ for (j = 0; j != p->objects; j++) {
+ XFillPolygon(xp->d, xp->w, pgc, curPoint, nsides, mode,
+ CoordModeOrigin);
+ curPoint += nsides;
+ }
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
diff --git a/do_dots.c b/do_dots.c
new file mode 100644
index 0000000..8aab1a2
--- /dev/null
+++ b/do_dots.c
@@ -0,0 +1,70 @@
+/* $Xorg: do_dots.c,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static XPoint *points;
+static GC pgc;
+
+int InitDots(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ pgc = xp->fggc;
+
+ points = (XPoint *)malloc(p->objects * sizeof(XPoint));
+
+ for (i = 0; i != p->objects; i++) {
+ points[i].x = 2 * (i/MAXROWS);
+ points[i].y = 2 * (i%MAXROWS);
+ }
+ return reps;
+}
+
+void DoDots(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XDrawPoints(xp->d, xp->w, pgc, points, p->objects, CoordModeOrigin);
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndDots(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(points);
+}
+
diff --git a/do_lines.c b/do_lines.c
new file mode 100644
index 0000000..a12c759
--- /dev/null
+++ b/do_lines.c
@@ -0,0 +1,320 @@
+/* $Xorg: do_lines.c,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static XPoint *points;
+static GC pgc;
+
+static void GenerateLines(xp, p, ddashed)
+ XParms xp;
+ Parms p;
+ Bool ddashed;
+{
+ int size;
+ int half; /* Half of width if wide line */
+ int i;
+ int rows; /* Number of rows filled in current column */
+ int x, y; /* Next point */
+ int xdir, ydir; /* Which direction x, y are going */
+ int bigxdir;
+ int x1, y1; /* offsets to compute next point from current */
+ int phase; /* how far into 0..4*(size_1) we are */
+ float phasef; /* how far we are in real numbers */
+ float phaseinc; /* how much to increment phasef at each segment */
+ int size4; /* 4 * size */
+
+ if(ddashed)
+ pgc = xp->ddfggc;
+ else
+ pgc = xp->fggc;
+
+ size = p->special;
+ size4 = 4 * (size+1);
+ half = (size + 19) / 20;
+
+ points = (XPoint *)malloc((p->objects+1) * sizeof(XPoint));
+
+ /* All this x, x1, x1inc, etc. stuff is to create a pattern that
+ (1) scans down the screen vertically
+
+ (2) rotates the endpoints through all possible orientations
+
+ (3) bounces off bottom and top of window as needed
+
+ (4) moves left or right at each bounce to make things less boring
+ */
+
+ x = half;
+ y = half;
+ xdir = 1;
+ ydir = 1;
+ bigxdir = 1;
+ phasef = 0.0;
+ phaseinc = ((float)size4) / ((float)p->objects);
+ if (phaseinc < 1.0) phaseinc = 1.0;
+ rows = 0;
+
+ points[0].x = x;
+ points[0].y = y;
+
+ for (i = 1; i != (p->objects+1); i++) {
+ phase = phasef;
+ switch (phase / (size+1)) {
+ case 0:
+ x1 = size;
+ y1 = phase;
+ break;
+
+ case 1:
+ x1 = size - phase % (size+1);
+ y1 = size;
+ break;
+
+ case 2:
+ x1 = phase % (size+1);
+ y1 = size;
+ break;
+
+ case 3:
+ x1 = size;
+ y1 = size - phase % (size+1);
+ break;
+ } /* end switch */
+
+ /* Move down or up the screen */
+ y += (ydir * y1);
+
+ /* If off either top or bottom, backtrack to previous position and go
+ the other way instead. Also move in bigxdir if not already. */
+ rows++;
+ if (y < half || y >= (HEIGHT-half) || rows > MAXROWS) {
+ rows = 0;
+ if (bigxdir > 0) {
+ if (x + size < WIDTH - half) {
+ xdir = 1;
+ } else {
+ bigxdir = -1;
+ }
+ } else {
+ if (x - size > half) {
+ xdir = -1;
+ } else {
+ bigxdir = 1;
+ }
+ }
+ ydir = -ydir;
+ y += (2 * ydir * y1);
+ /* If still off top or bottom, we can't do the line we want.
+ This will happen infrequently if the window is not twice the
+ length of the line. So instead, let's draw a line that puts
+ the line after this approximately through the center of the
+ window. Since it is very unlikely that both x and y will
+ need such adjustment, line length (in pixels) should not
+ change...we just can't get the slope we want for this line. */
+ if (y < half) {
+ y = (HEIGHT - y1)/2;
+ ydir = 1;
+ } else if (y > (HEIGHT - half)) {
+ y = (HEIGHT + y1)/2;
+ ydir = -1;
+ }
+ }
+
+ /* Move x left or right by x1 */
+ x += (xdir * x1);
+ xdir = -xdir;
+ /* Again, if we are off the bottom then we can't really draw the line
+ we want. */
+ if (x < half) {
+ x = (WIDTH - x1)/2;
+ xdir = 1;
+ } else if (x > (WIDTH - half)) {
+ x = (WIDTH + x1)/2;
+ xdir = -1;
+ }
+ points[i].x = x;
+ points[i].y = y;
+
+ /* Increment phasef */
+ phasef += phaseinc;
+ if (phasef >= size4) phasef -= size4;
+
+ }
+}
+
+int InitLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateLines(xp, p, False);
+ return reps;
+}
+
+static int GenerateWideLines(xp, p, reps, ddashed)
+ XParms xp;
+ Parms p;
+ int reps;
+ Bool ddashed;
+{
+ int size;
+
+ GenerateLines(xp, p, ddashed);
+
+ size = p->special;
+ if(ddashed) {
+ XSetLineAttributes(xp->d, xp->ddbggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->ddfggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+ else {
+ XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ }
+
+ return reps;
+}
+
+int InitWideLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ return GenerateWideLines(xp, p, reps, False);
+}
+
+int InitDashedLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateLines(xp, p, False);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->bggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->fggc, 0, LineOnOffDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDashedLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ (void)GenerateWideLines(xp, p, reps, False);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineOnOffDash;
+ XChangeGC(xp->d, xp->fggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitDoubleDashedLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateLines(xp, p, True);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes(xp->d, xp->ddbggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->ddfggc, 0, LineDoubleDash, CapButt, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitWideDoubleDashedLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ XGCValues gcv;
+ char dashes[2];
+
+ (void)GenerateWideLines(xp, p, reps, True);
+ size = p->special;
+ size = (size + 9) / 10;
+
+ /* Modify GCs to draw dashed */
+ dashes[0] = 2*size; dashes[1] = 2*size;
+ gcv.line_style = LineDoubleDash;
+ XChangeGC(xp->d, xp->ddfggc, GCLineStyle, &gcv);
+ XChangeGC(xp->d, xp->ddbggc, GCLineStyle, &gcv);
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+void DoLines(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++)
+ {
+ XDrawLines(xp->d, xp->w, pgc, points, p->objects+1, CoordModeOrigin);
+ if (pgc == xp->ddbggc)
+ pgc = xp->ddfggc;
+ else if(pgc == xp->ddfggc)
+ pgc = xp->ddbggc;
+ else if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndLines(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(points);
+}
+
diff --git a/do_movewin.c b/do_movewin.c
new file mode 100644
index 0000000..034b51b
--- /dev/null
+++ b/do_movewin.c
@@ -0,0 +1,219 @@
+/* $Xorg: do_movewin.c,v 1.5 2000/11/30 12:19:00 pookie 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static Window *children;
+static XPoint *positions;
+static Window cover;
+static int rows;
+static x_offset, y_offset; /* Private global data for DoMoveWindows */
+static int xmax, ymax;
+static delta1; /* Private global data for DoResizeWindows */
+
+#define STACK (4*(HEIGHT-10)/CHILDSIZE)
+
+int InitMoveWindows(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i = 0;
+
+ rows = (p->objects + MAXCOLS - 1) / MAXCOLS;
+
+ x_offset = 0;
+ y_offset = 0;
+ delta1 = 1;
+
+ children = (Window *) malloc (p->objects*sizeof (Window));
+ positions = (XPoint *) malloc(p->objects*sizeof(XPoint));
+
+ xmax = (CHILDSIZE+CHILDSPACE) * (rows > 1 ? MAXCOLS : p->objects);
+ ymax = rows * (CHILDSIZE+CHILDSPACE);
+
+ for (i = 0; i != p->objects; i++) {
+ positions[i].x = (CHILDSIZE+CHILDSPACE) * (i/rows) + CHILDSPACE/2;
+ positions[i].y = (CHILDSIZE+CHILDSPACE) * (i%rows) + CHILDSPACE/2;
+ children[i] = XCreateSimpleWindow(xp->d, xp->w,
+ positions[i].x, positions[i].y,
+ CHILDSIZE, CHILDSIZE, 0, xp->foreground, xp->foreground);
+ }
+ if (p->special)
+ XMapSubwindows (xp->d, xp->w);
+ return reps;
+}
+
+void DoMoveWindows(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j;
+
+ for (i = 0; i != reps; i++) {
+ x_offset += 1;
+ y_offset += 3;
+ if (y_offset + ymax > HEIGHT)
+ y_offset = 0;
+ if (x_offset + xmax > WIDTH)
+ x_offset = 0;
+ for (j = 0; j != p->objects; j++) {
+ XMoveWindow(xp->d, children[j],
+ positions[j].x + x_offset, positions[j].y + y_offset);
+ }
+ }
+}
+
+void EndMoveWindows(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+ free(children);
+ free(positions);
+}
+
+void DoResizeWindows(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j, delta2;
+
+ for (i = 0; i != reps; i++) {
+ delta1 = -delta1;
+ delta2 = delta1;
+ for (j = 0; j != p->objects; j++) {
+ delta2 = -delta2;
+ XResizeWindow(xp->d, children[j],
+ CHILDSIZE+delta2, CHILDSIZE-delta2);
+ }
+ }
+}
+
+int InitCircWindows(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ int pos;
+ int color;
+
+ children = (Window *) malloc (p->objects * sizeof (Window));
+ for (i = 0; i != p->objects; i++) {
+ pos = i % STACK;
+ color = (i & 1 ? xp->foreground : xp->background);
+ children[i] = XCreateSimpleWindow (xp->d, xp->w,
+ pos*CHILDSIZE/4 + (i/STACK)*2*CHILDSIZE, pos*CHILDSIZE/4,
+ CHILDSIZE, CHILDSIZE, 0, color, color);
+ }
+ if (p->special)
+ XMapSubwindows (xp->d, xp->w);
+ return reps;
+}
+
+void DoCircWindows(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j;
+
+ for (i = 0; i != reps; i++)
+ for (j = 0; j != p->objects; j++)
+ XCirculateSubwindows (xp->d, xp->w, RaiseLowest);
+}
+
+void EndCircWindows(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+ free(children);
+}
+
+
+int InitMoveTree(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i = 0;
+
+ rows = (p->objects + MAXCOLS - 1) / MAXCOLS;
+
+ x_offset = 0;
+ y_offset = 0;
+ delta1 = 1;
+
+ children = (Window *) malloc (p->objects*sizeof (Window));
+ positions = (XPoint *) malloc(p->objects*sizeof(XPoint));
+
+ xmax = (CHILDSIZE+CHILDSPACE) * (rows > 1 ? MAXCOLS : p->objects);
+ ymax = rows * (CHILDSIZE+CHILDSPACE);
+
+ cover = XCreateSimpleWindow(xp->d, xp->w,
+ 0, 0, xmax, ymax, 0,
+ xp->background, xp->background);
+
+ for (i = 0; i != p->objects; i++) {
+ positions[i].x = (CHILDSIZE+CHILDSPACE) * (i/rows) + CHILDSPACE/2;
+ positions[i].y = (CHILDSIZE+CHILDSPACE) * (i%rows) + CHILDSPACE/2;
+ children[i] = XCreateSimpleWindow(xp->d, cover,
+ positions[i].x, positions[i].y,
+ CHILDSIZE, CHILDSIZE, 0, xp->foreground, xp->foreground);
+ }
+ XMapSubwindows (xp->d, cover);
+ XMapWindow (xp->d, cover);
+ return reps;
+}
+
+void DoMoveTree(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ x_offset += 1;
+ y_offset += 3;
+ if (y_offset + ymax > HEIGHT)
+ y_offset = 0;
+ if (x_offset + xmax > WIDTH)
+ x_offset = 0;
+ XMoveWindow(xp->d, cover, x_offset, y_offset);
+ }
+}
+
+void EndMoveTree(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroyWindow(xp->d, cover);
+ free(children);
+ free(positions);
+}
diff --git a/do_rects.c b/do_rects.c
new file mode 100644
index 0000000..e380b74
--- /dev/null
+++ b/do_rects.c
@@ -0,0 +1,127 @@
+/* $Xorg: do_rects.c,v 1.4 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+#include "bitmaps.h"
+
+static XRectangle *rects;
+static GC pgc;
+
+int InitRectangles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ int size = p->special;
+ int step;
+ int x, y;
+ int rows;
+ int lw = 0;
+
+ pgc = xp->fggc;
+
+ if (p->bfont)
+ {
+ lw = atoi (p->bfont);
+
+ XSetLineAttributes(xp->d, xp->bggc, lw, LineSolid, CapButt, JoinMiter);
+ XSetLineAttributes(xp->d, xp->fggc, lw, LineSolid, CapButt, JoinMiter);
+ lw = (lw >> 1) + 1;
+ }
+
+ rects = (XRectangle *)malloc(p->objects * sizeof(XRectangle));
+ x = lw;
+ y = lw;
+ rows = 0;
+ if (xp->pack) {
+ /* Pack rectangles as close as possible, mainly for debugging faster
+ tiling, stippling routines in a server */
+ step = size;
+ } else {
+ /* Try to exercise all alignments...any odd number is okay */
+ step = size + 1 + (size % 2);
+ }
+
+ for (i = 0; i != p->objects; i++) {
+ rects[i].x = x;
+ rects[i].y = y;
+ rects[i].width = rects[i].height = size;
+
+ y += step;
+ rows++;
+ if (y + size > HEIGHT || rows == MAXROWS) {
+ rows = 0;
+ y = lw;
+ x += step;
+ if (x + size > WIDTH) {
+ x = lw;
+ }
+ }
+ }
+
+ SetFillStyle(xp, p);
+
+ return reps;
+}
+
+void DoRectangles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XFillRectangles(xp->d, xp->w, pgc, rects, p->objects);
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void DoOutlineRectangles (xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XDrawRectangles (xp->d, xp->w, pgc, rects, p->objects);
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndRectangles(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(rects);
+}
+
diff --git a/do_segs.c b/do_segs.c
new file mode 100644
index 0000000..718751d
--- /dev/null
+++ b/do_segs.c
@@ -0,0 +1,402 @@
+/* $Xorg: do_segs.c,v 1.3 2000/08/17 19:54:09 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static XSegment *segments;
+static GC pgc;
+
+static void GenerateSegments(xp, p, ddashed)
+ XParms xp;
+ Parms p;
+ Bool ddashed;
+{
+ int size;
+ int half;
+ int i;
+ int rows; /* Number of rows filled in current column */
+ int x, y; /* base of square to draw in */
+ int x1, y1, x2, y2; /* offsets into square */
+ int phase; /* how far into 0..8*size we are */
+ int phaseinc; /* how much to increment phase at each segment */
+ int size8; /* 8 * size */
+ XGCValues gcv;
+
+ if(ddashed)
+ pgc = xp->ddfggc;
+ else
+ pgc = xp->fggc;
+
+
+ size = p->special;
+ size8 = 8 * size;
+ half = (size + 19) / 20;
+
+ segments = (XSegment *)malloc((p->objects) * sizeof(XSegment));
+
+ /* All this x, x1, etc. stuff is to create a pattern that
+ (1) scans down the screen vertically, with each new segment going
+ into a square of size^2.
+
+ (2) rotates the endpoints clockwise around the square
+
+ (3) rotates by ``large'' steps if we aren't going to paint enough
+ segments to get full coverage
+
+ (4) uses CapNotLast so we can create segments of length 1 that
+ nonetheless have a distinct direction
+ */
+
+ x = half; y = half;
+ phase = 0;
+ phaseinc = size8 / p->objects;
+ if (phaseinc == 0) phaseinc = 1;
+ rows = 0;
+
+ for (i = 0; i != p->objects; i++) {
+ switch (phase / size) {
+ case 0:
+ x1 = 0;
+ y1 = 0;
+ x2 = size;
+ y2 = phase;
+ break;
+
+ case 1:
+ x1 = phase % size;
+ y1 = 0;
+ x2 = size;
+ y2 = size;
+ break;
+
+ case 2:
+ x1 = size;
+ y1 = 0;
+ x2 = size - phase % size;
+ y2 = size;
+ break;
+
+ case 3:
+ x1 = size;
+ y1 = phase % size;
+ x2 = 0;
+ y2 = size;
+ break;
+
+ case 4:
+ x1 = size;
+ y1 = size;
+ x2 = 0;
+ y2 = size - phase % size;
+ break;
+
+ case 5:
+ x1 = size - phase % size;
+ y1 = size;
+ x2 = 0;
+ y2 = 0;
+ break;
+
+ case 6:
+ x1 = 0;
+ y1 = size;
+ x2 = phase % size;
+ y2 = 0;
+ break;
+
+ case 7:
+ x1 = 0;
+ y1 = size - phase % size;
+ x2 = size;
+ y2 = 0;
+ break;
+ } /* end switch */
+
+ segments[i].x1 = x + x1;
+ segments[i].y1 = y + y1;
+ segments[i].x2 = x + x2;
+ segments[i].y2 = y + y2;
+
+ /* Change square to draw segment in */
+ rows++;
+ y += size;
+ if (y >= HEIGHT - size - half || rows == MAXROWS) {
+ /* Go to next column */
+ rows = 0;
+ y = half;
+ x += size;
+ if (x >= WIDTH - size - half) {
+ x = half;
+ }
+ }
+
+ /* Increment phase */
+ phase += phaseinc;
+ if (phase >= size8) phase -= size8;
+
+ }
+
+ gcv.cap_style = CapNotLast;
+
+ if(ddashed) {
+ XChangeGC(xp->d, xp->ddfggc, GCCapStyle, &gcv);
+ XChangeGC(xp->d, xp->ddbggc, GCCapStyle, &gcv);
+ } else {
+ XChangeGC(xp->d, xp->fggc, GCCapStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCCapStyle, &gcv);
+ }
+}
+
+int InitSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ GenerateSegments(xp, p, False);
+ return reps;
+}
+
+int InitDashedSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateSegments(xp, p, False);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes
+ (xp->d, xp->bggc, 0, LineOnOffDash, CapNotLast, JoinMiter);
+ XSetLineAttributes
+ (xp->d, xp->fggc, 0, LineOnOffDash, CapNotLast, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->fggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->bggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitDoubleDashedSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char dashes[2];
+
+ GenerateSegments(xp, p, True);
+
+ /* Modify GCs to draw dashed */
+ XSetLineAttributes
+ (xp->d, xp->ddbggc, 0, LineDoubleDash, CapNotLast, JoinMiter);
+ XSetLineAttributes
+ (xp->d, xp->ddfggc, 0, LineDoubleDash, CapNotLast, JoinMiter);
+ dashes[0] = 3; dashes[1] = 2;
+ XSetDashes(xp->d, xp->ddfggc, 0, dashes, 2);
+ XSetDashes(xp->d, xp->ddbggc, 0, dashes, 2);
+ return reps;
+}
+
+int InitHorizSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ int half;
+ int i;
+ int rows; /* Number of rows filled in current column */
+ int x, y; /* base of square to draw in */
+ int y1; /* y position inside square */
+ int inc;
+ XGCValues gcv;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ half = (size + 19) / 20;
+
+ segments = (XSegment *)malloc((p->objects) * sizeof(XSegment));
+
+ x = half;
+ y = half;
+ y1 = 0;
+ rows = 0;
+ inc = size / p->objects;
+ if (inc == 0) inc = 1;
+
+ for (i = 0; i != p->objects; i++) {
+ if (i % 2) {
+ segments[i].x1 = x + size;
+ segments[i].x2 = x;
+ segments[i].y1 = y + size - y1;
+ segments[i].y2 = y + size - y1;
+ y1 += inc;
+ if (y1 >= size) y1 -= size;
+ } else {
+ segments[i].x1 = x;
+ segments[i].x2 = x + size;
+ segments[i].y1 = y + y1;
+ segments[i].y2 = y + y1;
+ }
+ rows++;
+ y += size;
+ if (y >= HEIGHT - size - half || rows == MAXROWS) {
+ rows = 0;
+ y = half;
+ x += size;
+ if (x >= WIDTH - size - half)
+ x = half;
+ }
+ }
+ gcv.cap_style = CapNotLast;
+ XChangeGC(xp->d, xp->fggc, GCCapStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCCapStyle, &gcv);
+ return reps;
+}
+
+int InitWideHorizSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+
+ (void)InitHorizSegments(xp, p, reps);
+
+ size = p->special;
+ XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+
+ return reps;
+}
+
+
+int InitVertSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+ int half;
+ int i;
+ int rows; /* Number of rows filled in current column */
+ int x, y; /* base of square to draw in */
+ int x1; /* x position inside square */
+ int inc;
+ XGCValues gcv;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ half = (size + 19) / 20;
+
+ segments = (XSegment *)malloc((p->objects) * sizeof(XSegment));
+
+ x = half;
+ y = half;
+ x1 = 0;
+ rows = 0;
+ inc = size / p->objects;
+ if (inc == 0) inc = 1;
+
+ for (i = 0; i != p->objects; i++) {
+ if (i % 2) {
+ segments[i].x1 = x + size - x1;
+ segments[i].x2 = x + size - x1;
+ segments[i].y1 = y + size;
+ segments[i].y2 = y;
+ x1 += inc;
+ if (x1 >= size) x1 -= size;
+ } else {
+ segments[i].x1 = x + x1;
+ segments[i].x2 = x + x1;
+ segments[i].y1 = y;
+ segments[i].y2 = y + size;
+ }
+ rows++;
+ y += size;
+ if (y >= HEIGHT - size - half || rows == MAXROWS) {
+ /* Go to next column */
+ rows = 0;
+ y = half;
+ x += size;
+ if (x >= WIDTH - size - half) {
+ x = half;
+ }
+ }
+ }
+ gcv.cap_style = CapNotLast;
+ XChangeGC(xp->d, xp->fggc, GCCapStyle, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCCapStyle, &gcv);
+ return reps;
+}
+
+int InitWideVertSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int size;
+
+ (void)InitVertSegments(xp, p, reps);
+
+ size = p->special;
+ XSetLineAttributes(xp->d, xp->bggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+ XSetLineAttributes(xp->d, xp->fggc, (int) ((size + 9) / 10),
+ LineSolid, CapRound, JoinRound);
+
+ return reps;
+}
+
+
+void DoSegments(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XDrawSegments(xp->d, xp->w, pgc, segments, p->objects);
+ if (pgc == xp->ddbggc)
+ pgc = xp->ddfggc;
+ else if(pgc == xp->ddfggc)
+ pgc = xp->ddbggc;
+ else if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+void EndSegments(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(segments);
+}
+
diff --git a/do_simple.c b/do_simple.c
new file mode 100644
index 0000000..358f27f
--- /dev/null
+++ b/do_simple.c
@@ -0,0 +1,116 @@
+/* $Xorg: do_simple.c,v 1.5 2000/11/30 12:20:45 pookie 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.
+
+******************************************************************************/
+
+#ifndef VMS
+#include <X11/Xatom.h>
+#else
+#include <decw$include/Xatom.h>
+#endif
+
+#include "x11perf.h"
+
+static Atom XA_PK_TEMP;
+static Window root;
+
+void DoNoOp(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ XNoOp(xp->d);
+ }
+}
+
+
+void DoGetAtom(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ char *atom;
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ atom = XGetAtomName (xp->d, 1);
+ XFree(atom); /* fix XBUG 6480 */
+ }
+}
+
+void DoQueryPointer(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ Window w;
+ int x;
+ unsigned int m;
+
+ for (i = 0; i != reps; i++) {
+ XQueryPointer (xp->d, xp->w, &w, &w, &x, &x, &x, &x, &m);
+ }
+}
+
+int InitGetProperty(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ long foo[4];
+
+ foo[0] = 41;
+ foo[1] = 14;
+ foo[2] = 37;
+ foo[3] = 73;
+ root = RootWindow (xp->d, 0);
+ XA_PK_TEMP = XInternAtom (xp->d, "_PK_TEMP", False);
+ XChangeProperty (
+ xp->d, xp->w, XA_PK_TEMP, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *)foo, 4);
+ return reps;
+}
+
+void DoGetProperty(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, status;
+ int actual_format;
+ unsigned long actual_length, bytes_remaining;
+ unsigned char *prop;
+
+ Atom actual_type;
+
+ for (i = 0; i != reps; i++) {
+ status = XGetWindowProperty (
+ xp->d, xp->w, XA_PK_TEMP, 0, 4,
+ False, AnyPropertyType, &actual_type, &actual_format,
+ &actual_length, &bytes_remaining, &prop);
+ XFree(prop);
+ }
+}
diff --git a/do_tests.c b/do_tests.c
new file mode 100644
index 0000000..c938de9
--- /dev/null
+++ b/do_tests.c
@@ -0,0 +1,1297 @@
+/* $Xorg: do_tests.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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+extern void DoGetAtom();
+extern void DoQueryPointer();
+
+extern void DoNoOp();
+
+extern Bool InitGetProperty();
+extern void DoGetProperty();
+
+extern Bool InitRectangles();
+extern void DoRectangles();
+extern void DoOutlineRectangles();
+extern void EndRectangles();
+
+extern Bool InitGC();
+extern void DoChangeGC();
+extern void EndGC();
+
+extern Bool InitSegments();
+extern Bool InitHorizSegments();
+extern Bool InitVertSegments();
+extern Bool InitWideHorizSegments();
+extern Bool InitWideVertSegments();
+extern Bool InitDashedSegments();
+extern Bool InitDoubleDashedSegments();
+extern void DoSegments();
+extern void EndSegments();
+
+extern Bool InitLines();
+extern Bool InitWideLines();
+extern Bool InitDashedLines();
+extern Bool InitWideDashedLines();
+extern Bool InitDoubleDashedLines();
+extern Bool InitWideDoubleDashedLines();
+extern void DoLines();
+extern void EndLines();
+
+
+extern Bool InitCircles();
+extern Bool InitPartCircles();
+extern Bool InitWideCircles();
+extern Bool InitPartWideCircles();
+extern Bool InitDashedCircles();
+extern Bool InitWideDashedCircles();
+extern Bool InitDoubleDashedCircles();
+extern Bool InitWideDoubleDashedCircles();
+extern Bool InitChordPartCircles();
+extern Bool InitSlicePartCircles();
+
+extern Bool InitEllipses();
+extern Bool InitPartEllipses();
+extern Bool InitWideEllipses();
+extern Bool InitPartWideEllipses();
+extern Bool InitDashedEllipses();
+extern Bool InitWideDashedEllipses();
+extern Bool InitDoubleDashedEllipses();
+extern Bool InitWideDoubleDashedEllipses();
+extern Bool InitChordPartEllipses();
+extern Bool InitSlicePartEllipses();
+extern void DoArcs();
+extern void DoFilledArcs();
+extern void EndArcs();
+
+extern Bool InitDots();
+extern void DoDots();
+extern void EndDots();
+
+extern Bool InitCreate();
+extern void CreateChildren();
+extern void DestroyChildren();
+extern void EndCreate();
+
+extern Bool InitMap();
+extern void MapParents();
+extern void UnmapParents();
+
+extern Bool InitDestroy();
+extern void DestroyParents();
+extern void RenewParents();
+
+extern Bool InitMoveWindows();
+extern void DoMoveWindows();
+extern void EndMoveWindows();
+
+extern void DoResizeWindows();
+
+extern Bool InitCircWindows();
+extern void DoCircWindows();
+extern void EndCircWindows();
+
+extern Bool InitMoveTree();
+extern void DoMoveTree();
+extern void EndMoveTree();
+
+extern Bool InitText();
+extern Bool InitText16();
+extern void DoText();
+extern void DoText16();
+extern void DoImageText();
+extern void DoImageText16();
+extern void DoPolyText();
+extern void DoPolyText16();
+extern void ClearTextWin();
+extern void EndText();
+extern void EndText16();
+
+extern Bool InitCopyPlane();
+extern void DoCopyPlane();
+extern void EndCopyPlane();
+
+extern Bool InitPopups();
+extern void DoPopUps();
+extern void EndPopups();
+
+extern Bool InitScroll();
+extern void DoScroll();
+extern void MidScroll();
+extern void EndScroll();
+
+extern Bool InitCopyWin();
+extern Bool InitCopyPix();
+extern void DoCopyWinWin();
+extern void DoCopyPixWin();
+extern void DoCopyWinPix();
+extern void DoCopyPixPix();
+extern void MidCopyPix();
+extern void EndCopyWin();
+extern void EndCopyPix();
+
+extern Bool InitGetImage();
+extern void DoGetImage();
+extern void EndGetImage();
+
+extern Bool InitPutImage();
+extern void DoPutImage();
+
+#ifdef MITSHM
+extern Bool InitShmPutImage();
+extern void DoShmPutImage();
+extern void EndShmPutImage();
+#endif
+
+extern Bool InitTriangles();
+extern void DoTriangles();
+extern void EndTriangles();
+
+extern Bool InitTrapezoids();
+extern void DoTrapezoids();
+extern void EndTrapezoids();
+
+extern Bool InitComplexPoly();
+extern void DoComplexPoly();
+extern void EndComplexPoly();
+
+extern Bool InitGeneralPoly();
+extern void DoGeneralPoly();
+
+/*
+ * some test must be done a certain multiple of times. That multiple is
+ * in the second half of the products below. You can edit the multiplier,
+ * just not the multiplicand.
+ */
+
+Test test[] = {
+ {"-dot", "Dot", NULL,
+ InitDots, DoDots, NullProc, EndDots,
+ V1_2FEATURE, ROP, 0,
+ {POLY}},
+ {"-rect1", "1x1 rectangle", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillSolid}},
+ {"-rect10", "10x10 rectangle", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillSolid}},
+ {"-rect100", "100x100 rectangle", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {36, 100, NULL, NULL, FillSolid}},
+ {"-rect500", "500x500 rectangle", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {1, 500, NULL, NULL, FillSolid}},
+ {"-srect1", "1x1 stippled rectangle",
+ "1x1 stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillStippled}},
+ {"-srect10", "10x10 stippled rectangle",
+ "10x10 stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillStippled}},
+ {"-srect100", "100x100 stippled rectangle",
+ "100x100 stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {36, 100, NULL, NULL, FillStippled}},
+ {"-srect500", "500x500 stippled rectangle",
+ "500x500 stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {1, 500, NULL, NULL, FillStippled}},
+ {"-osrect1", "1x1 opaque stippled rectangle",
+ "1x1 opaque stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillOpaqueStippled}},
+ {"-osrect10", "10x10 opaque stippled rectangle",
+ "10x10 opaque stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillOpaqueStippled}},
+ {"-osrect100", "100x100 opaque stippled rectangle",
+ "100x100 opaque stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {36, 100, NULL, NULL, FillOpaqueStippled}},
+ {"-osrect500", "500x500 opaque stippled rectangle",
+ "500x500 opaque stippled rectangle (8x8 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {1, 500, NULL, NULL, FillOpaqueStippled}},
+ {"-tilerect1", "1x1 4x4 tiled rectangle",
+ "1x1 tiled rectangle (4x4 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillTiled}},
+ {"-tilerect10", "10x10 4x4 tiled rectangle",
+ "10x10 tiled rectangle (4x4 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillTiled}},
+ {"-tilerect100", "100x100 4x4 tiled rectangle",
+ "100x100 tiled rectangle (4x4 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {36, 100, NULL, NULL, FillTiled}},
+ {"-tilerect500", "500x500 4x4 tiled rectangle",
+ "500x500 tiled rectangle (4x4 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {1, 500, NULL, NULL, FillTiled}},
+ {"-oddsrect1", "1x1 stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillStippled}},
+ {"-oddsrect10", "10x10 stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillStippled}},
+ {"-oddsrect100", "100x100 stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {36, 100, "OddTile", NULL, FillStippled}},
+ {"-oddsrect500", "500x500 stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {1, 500, "OddTile", NULL, FillStippled}},
+ {"-oddosrect1", "1x1 opaque stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddosrect10", "10x10 opaque stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddosrect100", "100x100 opaque stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {36, 100, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddosrect500", "500x500 opaque stippled rectangle (17x15 stipple)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {1, 500, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddtilerect1", "1x1 tiled rectangle (17x15 tile)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillTiled}},
+ {"-oddtilerect10", "10x10 tiled rectangle (17x15 tile)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillTiled}},
+ {"-oddtilerect100", "100x100 tiled rectangle (17x15 tile)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {36, 100, "OddTile", NULL, FillTiled}},
+ {"-oddtilerect500", "500x500 tiled rectangle (17x15 tile)", NULL,
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_4FEATURE, ROP, 0,
+ {1, 500, "OddTile", NULL, FillTiled}},
+ {"-bigsrect1", "1x1 161x145 stippled rectangle",
+ "1x1 stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillStippled}},
+ {"-bigsrect10", "10x10 161x145 stippled rectangle",
+ "10x10 stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillStippled}},
+ {"-bigsrect100", "100x100 161x145 stippled rectangle",
+ "100x100 stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, "mensetmanus", NULL, FillStippled}},
+ {"-bigsrect500", "500x500 161x145 stippled rectangle",
+ "500x500 stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {1, 500, "mensetmanus", NULL, FillStippled}},
+ {"-bigosrect1", "1x1 161x145 opaque stippled rectangle",
+ "1x1 opaque stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigosrect10", "10x10 161x145 opaque stippled rectangle",
+ "10x10 opaque stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigosrect100", "100x100 161x145 opaque stippled rectangle",
+ "100x100 opaque stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigosrect500", "500x500 161x145 opaque stippled rectangle",
+ "500x500 opaque stippled rectangle (161x145 stipple)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {1, 500, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigtilerect1", "1x1 161x145 tiled rectangle",
+ "1x1 tiled rectangle (161x145 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillTiled}},
+ {"-bigtilerect10", "10x10 161x145 tiled rectangle",
+ "10x10 tiled rectangle (161x145 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillTiled}},
+ {"-bigtilerect100", "100x100 161x145 tiled rectangle",
+ "100x100 tiled rectangle (161x145 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {36, 100, "mensetmanus", NULL, FillTiled}},
+ {"-bigtilerect500", "500x500 161x145 tiled rectangle",
+ "500x500 tiled rectangle (161x145 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_2FEATURE, ROP, 0,
+ {1, 500, "mensetmanus", NULL, FillTiled}},
+ {"-eschertilerect1", "1x1 216x208 tiled rectangle",
+ "1x1 tiled rectangle (216x208 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 1, "escherknot", NULL, FillTiled}},
+ {"-eschertilerect10", "10x10 216x208 tiled rectangle",
+ "10x10 tiled rectangle (216x208 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "escherknot", NULL, FillTiled}},
+ {"-eschertilerect100", "100x100 216x208 tiled rectangle",
+ "100x100 tiled rectangle (216x208 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, "escherknot", NULL, FillTiled}},
+ {"-eschertilerect500", "500x500 216x208 tiled rectangle",
+ "500x500 tiled rectangle (216x208 tile)",
+ InitRectangles, DoRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {1, 500, "escherknot", NULL, FillTiled}},
+ {"-seg1", "1-pixel line segment", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-seg10", "10-pixel line segment", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-seg100", "100-pixel line segment", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-seg500", "500-pixel line segment", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 500}},
+ {"-seg100c1", "100-pixel line segment (1 kid)", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 1,
+ {POLY, 100}},
+ {"-seg100c2", "100-pixel line segment (2 kids)", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 2,
+ {POLY, 100}},
+ {"-seg100c3", "100-pixel line segment (3 kids)", NULL,
+ InitSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 3,
+ {POLY, 100}},
+ {"-dseg10", "10-pixel dashed segment", NULL,
+ InitDashedSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-dseg100", "100-pixel dashed segment", NULL,
+ InitDashedSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-ddseg100", "100-pixel double-dashed segment", NULL,
+ InitDoubleDashedSegments, DoSegments, NullProc, EndSegments,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-hseg10", "10-pixel horizontal line segment", NULL,
+ InitHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-hseg100", "100-pixel horizontal line segment", NULL,
+ InitHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-hseg500", "500-pixel horizontal line segment", NULL,
+ InitHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 500}},
+ {"-vseg10", "10-pixel vertical line segment", NULL,
+ InitVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-vseg100", "100-pixel vertical line segment", NULL,
+ InitVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-vseg500", "500-pixel vertical line segment", NULL,
+ InitVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 500}},
+ {"-whseg10", "10x1 wide horizontal line segment", NULL,
+ InitWideHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {200, 10}},
+ {"-whseg100", "100x10 wide horizontal line segment", NULL,
+ InitWideHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {100, 100}},
+ {"-whseg500", "500x50 wide horizontal line segment", NULL,
+ InitWideHorizSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {50, 500}},
+ {"-wvseg10", "10x1 wide vertical line segment", NULL,
+ InitWideVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {200, 10}},
+ {"-wvseg100", "100x10 wide vertical line segment", NULL,
+ InitWideVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wvseg500", "500x50 wide vertical line segment", NULL,
+ InitWideVertSegments, DoSegments, NullProc, EndSegments,
+ V1_3FEATURE, ROP, 0,
+ {50, 500}},
+ {"-line1", "1-pixel line", NULL,
+ InitLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-line10", "10-pixel line", NULL,
+ InitLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-line100", "100-pixel line", NULL,
+ InitLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-line500", "500-pixel line", NULL,
+ InitLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 500}},
+ {"-dline10", "10-pixel dashed line", NULL,
+ InitDashedLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-dline100", "100-pixel dashed line", NULL,
+ InitDashedLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-ddline100", "100-pixel double-dashed line", NULL,
+ InitDoubleDashedLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 100}},
+ {"-wline10", "10x1 wide line", NULL,
+ InitWideLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {100, 10}},
+ {"-wline100", "100x10 wide line", NULL,
+ InitWideLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wline500", "500x50 wide line", NULL,
+ InitWideLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {50, 500}},
+ {"-wdline100", "100x10 wide dashed line", NULL,
+ InitWideDashedLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wddline100", "100x10 wide double-dashed line", NULL,
+ InitWideDoubleDashedLines, DoLines, NullProc, EndLines,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-orect10", "10x10 rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, NULL, "0", FillSolid}},
+ {"-orect100", "100x100 rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, NULL, "0", FillSolid}},
+ {"-orect500", "500x500 rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {1, 500, NULL, "0", FillSolid}},
+ {"-worect10", "10x10 wide rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, NULL, "1", FillSolid}},
+ {"-worect100", "100x100 wide rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, NULL, "10", FillSolid}},
+ {"-worect500", "500x500 wide rectangle outline", NULL,
+ InitRectangles, DoOutlineRectangles, NullProc, EndRectangles,
+ V1_3FEATURE, ROP, 0,
+ {1, 500, NULL, "50", FillSolid}},
+ {"-circle1", "1-pixel circle", NULL,
+ InitCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-circle10", "10-pixel circle", NULL,
+ InitCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-circle100", "100-pixel circle", NULL,
+ InitCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {200, 100}},
+ {"-circle500", "500-pixel circle", NULL,
+ InitCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {50, 500}},
+ {"-dcircle100", "100-pixel dashed circle", NULL,
+ InitDashedCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-ddcircle100", "100-pixel double-dashed circle", NULL,
+ InitDoubleDashedCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wcircle10", "10-pixel wide circle", NULL,
+ InitWideCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-wcircle100", "100-pixel wide circle", NULL,
+ InitWideCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wcircle500", "500-pixel wide circle", NULL,
+ InitWideCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 500}},
+ {"-wdcircle100", "100-pixel wide dashed circle", NULL,
+ InitWideDashedCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-wddcircle100", "100-pixel wide double-dashed circle", NULL,
+ InitWideDoubleDashedCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-pcircle10", "10-pixel partial circle", NULL,
+ InitPartCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-pcircle100", "100-pixel partial circle", NULL,
+ InitPartCircles, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {198, 100}},
+ {"-wpcircle10", "10-pixel wide partial circle", NULL,
+ InitPartWideCircles, DoArcs, NullProc, EndArcs,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-wpcircle100", "100-pixel wide partial circle", NULL,
+ InitPartWideCircles, DoArcs, NullProc, EndArcs,
+ V1_3FEATURE, ROP, 0,
+ {198, 100}},
+ {"-fcircle1", "1-pixel solid circle", NULL,
+ InitCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-fcircle10", "10-pixel solid circle", NULL,
+ InitCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-fcircle100", "100-pixel solid circle", NULL,
+ InitCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 100}},
+ {"-fcircle500", "500-pixel solid circle", NULL,
+ InitCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {20, 500}},
+ {"-fcpcircle10", "10-pixel fill chord partial circle", NULL,
+ InitChordPartCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-fcpcircle100", "100-pixel fill chord partial circle", NULL,
+ InitChordPartCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {108, 100}},
+ {"-fspcircle10", "10-pixel fill slice partial circle", NULL,
+ InitSlicePartCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-fspcircle100", "100-pixel fill slice partial circle", NULL,
+ InitSlicePartCircles, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {108, 100}},
+ {"-ellipse10", "10-pixel ellipse", NULL,
+ InitEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {500, 10}},
+ {"-ellipse100", "100-pixel ellipse", NULL,
+ InitEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {300, 100}},
+ {"-ellipse500", "500-pixel ellipse", NULL,
+ InitEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {100, 500}},
+ {"-dellipse100", "100-pixel dashed ellipse", NULL,
+ InitDashedEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-ddellipse100", "100-pixel double-dashed ellipse", NULL,
+ InitDoubleDashedEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-wellipse10", "10-pixel wide ellipse", NULL,
+ InitWideEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {200, 10}},
+ {"-wellipse100", "100-pixel wide ellipse", NULL,
+ InitWideEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-wellipse500", "500-pixel wide ellipse", NULL,
+ InitWideEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {20, 500}},
+ {"-wdellipse100", "100-pixel wide dashed ellipse", NULL,
+ InitWideDashedEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-wddellipse100", "100-pixel wide double-dashed ellipse", NULL,
+ InitWideDoubleDashedEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-pellipse10", "10-pixel partial ellipse", NULL,
+ InitPartEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {540, 10}},
+ {"-pellipse100", "100-pixel partial ellipse", NULL,
+ InitPartEllipses, DoArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {360, 100}},
+ {"-wpellipse10", "10-pixel wide partial ellipse", NULL,
+ InitPartWideEllipses, DoArcs, NullProc, EndArcs,
+ V1_3FEATURE, ROP, 0,
+ {540, 10}},
+ {"-wpellipse100", "100-pixel wide partial ellipse", NULL,
+ InitPartWideEllipses, DoArcs, NullProc, EndArcs,
+ V1_3FEATURE, ROP, 0,
+ {360, 100}},
+ {"-fellipse10", "10-pixel filled ellipse", NULL,
+ InitEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {200, 10}},
+ {"-fellipse100", "100-pixel filled ellipse", NULL,
+ InitEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {25, 100}},
+ {"-fellipse500", "500-pixel filled ellipse", NULL,
+ InitEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {10, 500}},
+ {"-fcpellipse10", "10-pixel fill chord partial ellipse", NULL,
+ InitChordPartEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {270, 10}},
+ {"-fcpellipse100", "100-pixel fill chord partial ellipse", NULL,
+ InitChordPartEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {36, 100}},
+ {"-fspellipse10", "10-pixel fill slice partial ellipse", NULL,
+ InitSlicePartEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {270, 10}},
+ {"-fspellipse100", "100-pixel fill slice partial ellipse", NULL,
+ InitSlicePartEllipses, DoFilledArcs, NullProc, EndArcs,
+ V1_2FEATURE, ROP, 0,
+ {36, 100}},
+ {"-triangle1", "Fill 1-pixel/side triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_2ONLY, ROP, 0,
+ {POLY, 1}},
+ {"-triangle10", "Fill 10-pixel/side triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_2ONLY, ROP, 0,
+ {POLY, 10}},
+ {"-triangle100", "Fill 100-pixel/side triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_2ONLY, ROP, 0,
+ {100, 100}},
+ {"-triangle1", "Fill 1x1 equivalent triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-triangle10", "Fill 10x10 equivalent triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-triangle100", "Fill 100x100 equivalent triangle", NULL,
+ InitTriangles, DoTriangles, NullProc, EndTriangles,
+ V1_3FEATURE, ROP, 0,
+ {100, 100}},
+ {"-trap1", "Fill 1x1 trapezoid", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1}},
+ {"-trap10", "Fill 10x10 trapezoid", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-trap100", "Fill 100x100 trapezoid", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {POLY/10, 100}},
+ {"-trap300", "Fill 300x300 trapezoid", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300}},
+ {"-strap1", "Fill 1x1 stippled trapezoid (8x8 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillStippled}},
+ {"-strap10", "Fill 10x10 stippled trapezoid",
+ "Fill 10x10 stippled trapezoid (8x8 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillStippled}},
+ {"-strap100", "Fill 100x100 stippled trapezoid",
+ "Fill 100x100 stippled trapezoid (8x8 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {100, 100, NULL, NULL, FillStippled}},
+ {"-strap300", "Fill 300x300 stippled trapezoid (8x8 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, NULL, NULL, FillStippled}},
+ {"-ostrap1", "Fill 1x1 opaque stippled trapezoid (8x8 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillOpaqueStippled}},
+ {"-ostrap10", "Fill 10x10 opaque stippled trapezoid",
+ "Fill 10x10 opaque stippled trapezoid (8x8 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillOpaqueStippled}},
+ {"-ostrap100", "Fill 100x100 opaque stippled trapezoid",
+ "Fill 100x100 opaque stippled trapezoid (8x8 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {100, 100, NULL, NULL, FillOpaqueStippled}},
+ {"-ostrap300", "Fill 300x300 opaque stippled trapezoid (8x8 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, NULL, NULL, FillOpaqueStippled}},
+ {"-tiletrap1", "Fill 1x1 tiled trapezoid (4x4 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, NULL, NULL, FillTiled}},
+ {"-tiletrap10", "Fill 10x10 tiled trapezoid",
+ "Fill 10x10 tiled trapezoid (4x4 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {POLY, 10, NULL, NULL, FillTiled}},
+ {"-tiletrap100", "Fill 100x100 tiled trapezoid",
+ "Fill 100x100 tiled trapezoid (4x4 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_2FEATURE, ROP, 0,
+ {100, 100, NULL, NULL, FillTiled}},
+ {"-tiletrap300", "Fill 300x300 tiled trapezoid (4x4 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, NULL, NULL, FillTiled}},
+ {"-oddstrap1", "Fill 1x1 stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillStippled}},
+ {"-oddstrap10", "Fill 10x10 stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillStippled}},
+ {"-oddstrap100", "Fill 100x100 stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {100, 100, "OddTile", NULL, FillStippled}},
+ {"-oddstrap300", "Fill 300x300 stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "OddTile", NULL, FillStippled}},
+ {"-oddostrap1", "Fill 1x1 opaque stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddostrap10", "Fill 10x10 opaque stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddostrap100", "Fill 100x100 opaque stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {100, 100, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddostrap300", "Fill 300x300 opaque stippled trapezoid (17x15 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "OddTile", NULL, FillOpaqueStippled}},
+ {"-oddtiletrap1", "Fill 1x1 tiled trapezoid (17x15 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "OddTile", NULL, FillTiled}},
+ {"-oddtiletrap10", "Fill 10x10 tiled trapezoid (17x15 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, "OddTile", NULL, FillTiled}},
+ {"-oddtiletrap100", "Fill 100x100 tiled trapezoid (17x15 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {100, 100, "OddTile", NULL, FillTiled}},
+ {"-oddtiletrap300", "Fill 300x300 tiled trapezoid (17x15 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "OddTile", NULL, FillTiled}},
+ {"-bigstrap1", "Fill 1x1 stippled trapezoid (161x145 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillStippled}},
+ {"-bigstrap10", "Fill 10x10 161x145 stippled trapezoid",
+ "Fill 10x10 stippled trapezoid (161x145 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillStippled}},
+ {"-bigstrap100", "Fill 100x100 161x145 stippled trapezoid",
+ "Fill 100x100 stippled trapezoid (161x145 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {100, 100, "mensetmanus", NULL, FillStippled}},
+ {"-bigstrap300", "Fill 300x300 stippled trapezoid (161x145 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "mensetmanus", NULL, FillStippled}},
+ {"-bigostrap1", "Fill 1x1 opaque stippled trapezoid (161x145 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigostrap10", "Fill 10x10 161x145 opaque stippled trapezoid",
+ "Fill 10x10 opaque stippled trapezoid (161x145 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigostrap100", "Fill 100x100 161x145 opaque stippled trapezoid",
+ "Fill 100x100 opaque stippled trapezoid (161x145 stipple)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {100, 100, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigostrap300", "Fill 300x300 opaque stippled trapezoid (161x145 stipple)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "mensetmanus", NULL, FillOpaqueStippled}},
+ {"-bigtiletrap1", "Fill 1x1 tiled trapezoid (161x145 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "mensetmanus", NULL, FillTiled}},
+ {"-bigtiletrap10", "Fill 10x10 161x145 tiled trapezoid",
+ "Fill 10x10 tiled trapezoid (161x145 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "mensetmanus", NULL, FillTiled}},
+ {"-bigtiletrap100", "Fill 100x100 161x145 tiled trapezoid",
+ "Fill 100x100 tiled trapezoid (161x145 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {100, 100, "mensetmanus", NULL, FillTiled}},
+ {"-bigtiletrap300", "Fill 300x300 tiled trapezoid (161x145 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "mensetmanus", NULL, FillTiled}},
+ {"-eschertiletrap1", "Fill 1x1 tiled trapezoid (216x208 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 1, "escherknot", NULL, FillTiled}},
+ {"-eschertiletrap10", "Fill 10x10 216x208 tiled trapezoid",
+ "Fill 10x10 tiled trapezoid (216x208 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10, "escherknot", NULL, FillTiled}},
+ {"-eschertiletrap100", "Fill 100x100 216x208 tiled trapezoid",
+ "Fill 100x100 tiled trapezoid (216x208 tile)",
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_3FEATURE, ROP, 0,
+ {36, 100, "escherknot", NULL, FillTiled}},
+ {"-eschertiletrap300", "Fill 300x300 tiled trapezoid (216x208 tile)", NULL,
+ InitTrapezoids, DoTrapezoids, NullProc, EndTrapezoids,
+ V1_4FEATURE, ROP, 0,
+ {2, 300, "escherknot", NULL, FillTiled}},
+ {"-complex10", "Fill 10-pixel/side complex polygon", NULL,
+ InitComplexPoly, DoComplexPoly, NullProc, EndComplexPoly,
+ V1_2ONLY, ROP, 0,
+ {POLY, 10}},
+ {"-complex100", "Fill 100-pixel/side complex polygons", NULL,
+ InitComplexPoly, DoComplexPoly, NullProc, EndComplexPoly,
+ V1_2ONLY, ROP, 0,
+ {POLY/10, 100}},
+ {"-complex10", "Fill 10x10 equivalent complex polygon", NULL,
+ InitComplexPoly, DoComplexPoly, NullProc, EndComplexPoly,
+ V1_3FEATURE, ROP, 0,
+ {POLY, 10}},
+ {"-complex100", "Fill 100x100 equivalent complex polygons", NULL,
+ InitComplexPoly, DoComplexPoly, NullProc, EndComplexPoly,
+ V1_3FEATURE, ROP, 0,
+ {POLY/10, 100}},
+ {"-64poly10convex", "Fill 10x10 64-gon (Convex)", NULL,
+ InitGeneralPoly, DoGeneralPoly, NullProc, EndComplexPoly,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, (char *) 64, (char *) Convex}},
+ {"-64poly100convex", "Fill 100x100 64-gon (Convex)", NULL,
+ InitGeneralPoly, DoGeneralPoly, NullProc, EndComplexPoly,
+ V1_4FEATURE, ROP, 0,
+ {POLY/10, 100, (char *) 64, (char *) Convex}},
+ {"-64poly10complex", "Fill 10x10 64-gon (Complex)", NULL,
+ InitGeneralPoly, DoGeneralPoly, NullProc, EndComplexPoly,
+ V1_4FEATURE, ROP, 0,
+ {POLY, 10, (char *) 64, (char *) Complex}},
+ {"-64poly100complex", "Fill 100x100 64-gon (Complex)", NULL,
+ InitGeneralPoly, DoGeneralPoly, NullProc, EndComplexPoly,
+ V1_4FEATURE, ROP, 0,
+ {POLY/10, 100, (char *) 64, (char *) Complex}},
+ {"-ftext", "Char in 80-char line (6x13)", NULL,
+ InitText, DoText, ClearTextWin, EndText,
+ V1_2FEATURE, ROP, 0,
+ {80, False, "6x13", NULL}},
+ {"-f8text", "Char in 70-char line (8x13)", NULL,
+ InitText, DoText, ClearTextWin, EndText,
+ V1_3FEATURE, ROP, 0,
+ {70, False, "8x13", NULL}},
+ {"-f9text", "Char in 60-char line (9x15)", NULL,
+ InitText, DoText, ClearTextWin, EndText,
+ V1_3FEATURE, ROP, 0,
+ {60, False, "9x15", NULL}},
+ {"-f14text16", "Char16 in 40-char line (k14)", NULL,
+ InitText16, DoText16, ClearTextWin, EndText16,
+ V1_3FEATURE, ROP, 0,
+ {40, False,
+ "-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-*",
+ NULL}},
+ {"-f24text16", "Char16 in 23-char line (k24)", NULL,
+ InitText16, DoText16, ClearTextWin, EndText16,
+ V1_3FEATURE, ROP, 0,
+ {23, False,
+ "-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-*",
+ NULL}},
+ {"-tr10text", "Char in 80-char line (TR 10)", NULL,
+ InitText, DoText, ClearTextWin, EndText,
+ V1_2FEATURE, ROP, 0,
+ {80, False,
+ "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1",
+ NULL}},
+ {"-tr24text", "Char in 30-char line (TR 24)", NULL,
+ InitText, DoText, ClearTextWin, EndText,
+ V1_2FEATURE, ROP, 0,
+ {30, False,
+ "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1",
+ NULL}},
+ {"-polytext", "Char in 20/40/20 line (6x13, TR 10)", NULL,
+ InitText, DoPolyText, ClearTextWin, EndText,
+ V1_2FEATURE, ROP, 0,
+ {80, True, "6x13",
+ "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1"}},
+ {"-polytext16", "Char16 in 7/14/7 line (k14, k24)", NULL,
+ InitText16, DoPolyText16, ClearTextWin, EndText16,
+ V1_3FEATURE, ROP, 0,
+ {28, True,
+ "-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-*",
+ "-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-*"}},
+ {"-fitext", "Char in 80-char image line (6x13)", NULL,
+ InitText, DoImageText, ClearTextWin, EndText,
+ V1_2FEATURE, PLANEMASK, 0,
+ {80, False, "6x13", NULL}},
+ {"-f8itext", "Char in 70-char image line (8x13)", NULL,
+ InitText, DoImageText, ClearTextWin, EndText,
+ V1_3FEATURE, PLANEMASK, 0,
+ {70, False, "8x13", NULL}},
+ {"-f9itext", "Char in 60-char image line (9x15)", NULL,
+ InitText, DoImageText, ClearTextWin, EndText,
+ V1_3FEATURE, PLANEMASK, 0,
+ {60, False, "9x15", NULL}},
+ {"-f14itext16", "Char16 in 40-char image line (k14)", NULL,
+ InitText16, DoImageText16, ClearTextWin, EndText16,
+ V1_3FEATURE, PLANEMASK, 0,
+ {40, False,
+ "-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-*",
+ NULL}},
+ {"-f24itext16", "Char16 in 23-char image line (k24)", NULL,
+ InitText16, DoImageText16, ClearTextWin, EndText16,
+ V1_3FEATURE, PLANEMASK, 0,
+ {23, False,
+ "-jis-fixed-medium-r-normal--24-230-75-75-c-240-jisx0208.1983-*",
+ NULL}},
+ {"-tr10itext", "Char in 80-char image line (TR 10)", NULL,
+ InitText, DoImageText, ClearTextWin, EndText,
+ V1_2FEATURE, PLANEMASK, 0,
+ {80, False,
+ "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1",
+ NULL}},
+ {"-tr24itext", "Char in 30-char image line (TR 24)", NULL,
+ InitText, DoImageText, ClearTextWin, EndText,
+ V1_2FEATURE, PLANEMASK, 0,
+ {30, False,
+ "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1",
+ NULL}},
+ {"-scroll10", "Scroll 10x10 pixels", NULL,
+ InitScroll, DoScroll, MidScroll, EndScroll,
+ V1_2FEATURE, ROP, 0,
+ {1, 10}},
+ {"-scroll100", "Scroll 100x100 pixels", NULL,
+ InitScroll, DoScroll, MidScroll, EndScroll,
+ V1_2FEATURE, ROP, 0,
+ {1, 100}},
+ {"-scroll500", "Scroll 500x500 pixels", NULL,
+ InitScroll, DoScroll, MidScroll, EndScroll,
+ V1_2FEATURE, ROP, 0,
+ {1, 500}},
+ {"-copywinwin10", "Copy 10x10 from window to window", NULL,
+ InitCopyWin, DoCopyWinWin, MidScroll, EndCopyWin,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-copywinwin100", "Copy 100x100 from window to window", NULL,
+ InitCopyWin, DoCopyWinWin, MidScroll, EndCopyWin,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-copywinwin500", "Copy 500x500 from window to window", NULL,
+ InitCopyWin, DoCopyWinWin, MidScroll, EndCopyWin,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-copypixwin10", "Copy 10x10 from pixmap to window", NULL,
+ InitCopyPix, DoCopyPixWin, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-copypixwin100", "Copy 100x100 from pixmap to window", NULL,
+ InitCopyPix, DoCopyPixWin, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-copypixwin500", "Copy 500x500 from pixmap to window", NULL,
+ InitCopyPix, DoCopyPixWin, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-copywinpix10", "Copy 10x10 from window to pixmap", NULL,
+ InitCopyPix, DoCopyWinPix, MidScroll, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-copywinpix100", "Copy 100x100 from window to pixmap", NULL,
+ InitCopyPix, DoCopyWinPix, MidScroll, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-copywinpix500", "Copy 500x500 from window to pixmap", NULL,
+ InitCopyPix, DoCopyWinPix, MidScroll, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-copypixpix10", "Copy 10x10 from pixmap to pixmap", NULL,
+ InitCopyPix, DoCopyPixPix, NullProc, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-copypixpix100", "Copy 100x100 from pixmap to pixmap", NULL,
+ InitCopyPix, DoCopyPixPix, NullProc, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-copypixpix500", "Copy 500x500 from pixmap to pixmap", NULL,
+ InitCopyPix, DoCopyPixPix, NullProc, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-copyplane10", "Copy 10x10 1-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-copyplane100", "Copy 100x100 1-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-copyplane500", "Copy 500x500 1-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-deepcopyplane10", "Copy 10x10 n-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_5FEATURE, ROP, 0,
+ {4, 10, "Deep"}},
+ {"-deepcopyplane100", "Copy 100x100 n-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_5FEATURE, ROP, 0,
+ {4, 100, "Deep"}},
+ {"-deepcopyplane500", "Copy 500x500 n-bit deep plane", NULL,
+ InitCopyPlane, DoCopyPlane, MidCopyPix, EndCopyPix,
+ V1_5FEATURE, ROP, 0,
+ {4, 500, "Deep"}},
+ {"-putimage10", "PutImage 10x10 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-putimage100", "PutImage 100x100 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-putimage500", "PutImage 500x500 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-putimagexy10", "PutImage XY 10x10 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 10, "XY"}},
+ {"-putimagexy100", "PutImage XY 100x100 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 100, "XY"}},
+ {"-putimagexy500", "PutImage XY 500x500 square", NULL,
+ InitPutImage, DoPutImage, MidCopyPix, EndGetImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 500, "XY"}},
+#ifdef MITSHM
+ {"-shmput10", "ShmPutImage 10x10 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 10}},
+ {"-shmput100", "ShmPutImage 100x100 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 100}},
+ {"-shmput500", "ShmPutImage 500x500 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_2FEATURE, ROP, 0,
+ {4, 500}},
+ {"-shmputxy10", "ShmPutImage XY 10x10 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 10, "XY"}},
+ {"-shmputxy100", "ShmPutImage XY 100x100 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 100, "XY"}},
+ {"-shmputxy500", "ShmPutImage XY 500x500 square", NULL,
+ InitShmPutImage, DoShmPutImage, MidCopyPix, EndShmPutImage,
+ V1_4FEATURE, ROP, 0,
+ {4, 500, "XY"}},
+#endif
+ {"-getimage10", "GetImage 10x10 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_2FEATURE, PLANEMASK, 0,
+ {4, 10}},
+ {"-getimage100", "GetImage 100x100 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_2FEATURE, PLANEMASK, 0,
+ {4, 100}},
+ {"-getimage500", "GetImage 500x500 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_2FEATURE, PLANEMASK, 0,
+ {4, 500}},
+ {"-getimagexy10", "GetImage XY 10x10 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_4FEATURE, PLANEMASK, 0,
+ {4, 10, "XY"}},
+ {"-getimagexy100", "GetImage XY 100x100 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_4FEATURE, PLANEMASK, 0,
+ {4, 100, "XY"}},
+ {"-getimagexy500", "GetImage XY 500x500 square", NULL,
+ InitGetImage, DoGetImage, NullProc, EndGetImage,
+ V1_4FEATURE, PLANEMASK, 0,
+ {4, 500, "XY"}},
+ {"-noop", "X protocol NoOperation", NULL,
+ NullInitProc, DoNoOp, NullProc, NullProc,
+ V1_2FEATURE, PLANEMASK, 0,
+ {1}},
+ {"-atom", "GetAtomName", NULL,
+ NullInitProc, DoGetAtom, NullProc, NullProc,
+ VERSION1_2 | VERSION1_3, NONROP, 0,
+ {1}},
+ {"-pointer", "QueryPointer", NULL,
+ NullInitProc, DoQueryPointer, NullProc, NullProc,
+ V1_4FEATURE, NONROP, 0,
+ {1}},
+ {"-prop", "GetProperty", NULL,
+ InitGetProperty, DoGetProperty, NullProc, NullProc,
+ V1_2FEATURE, NONROP, 0,
+ {1}},
+ {"-gc", "Change graphics context", NULL,
+ InitGC, DoChangeGC, NullProc, EndGC,
+ V1_2FEATURE, NONROP, 0,
+ {4}},
+ {"-create", "Create and map subwindows", NULL,
+ InitCreate, CreateChildren, DestroyChildren, EndCreate,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-ucreate", "Create unmapped window", NULL,
+ InitCreate, CreateChildren, DestroyChildren, EndCreate,
+ V1_2FEATURE, WINDOW, 0,
+ {0, False}},
+ {"-map", "Map window via parent", NULL,
+ InitMap, MapParents, UnmapParents, EndCreate,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-unmap", "Unmap window via parent", NULL,
+ InitDestroy, UnmapParents, MapParents, EndCreate,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-destroy", "Destroy window via parent", NULL,
+ InitDestroy, DestroyParents, RenewParents, EndCreate,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-popup", "Hide/expose window via popup", NULL,
+ InitPopups, DoPopUps, NullProc, EndPopups,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-move", "Move window", NULL,
+ InitMoveWindows, DoMoveWindows, NullProc, EndMoveWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {0, True}},
+ {"-umove", "Moved unmapped window", NULL,
+ InitMoveWindows, DoMoveWindows, NullProc, EndMoveWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {0, False}},
+ {"-movetree", "Move window via parent", NULL,
+ InitMoveTree, DoMoveTree, NullProc, EndMoveTree,
+ V1_2FEATURE, WINDOW, 0,
+ {4, True}},
+ {"-resize", "Resize window", NULL,
+ InitMoveWindows, DoResizeWindows, NullProc, EndMoveWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {4, True}},
+ {"-uresize", "Resize unmapped window", NULL,
+ InitMoveWindows, DoResizeWindows, NullProc, EndMoveWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {4, False}},
+ {"-circulate", "Circulate window", NULL,
+ InitCircWindows, DoCircWindows, NullProc, EndCircWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {4, True}},
+ {"-ucirculate", "Circulate Unmapped window", NULL,
+ InitCircWindows, DoCircWindows, NullProc, EndCircWindows,
+ V1_2FEATURE, WINDOW, 0,
+ {4, False}},
+ { NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ 0, NONROP, 0,
+ {0, False}}
+};
diff --git a/do_text.c b/do_text.c
new file mode 100644
index 0000000..c8f337f
--- /dev/null
+++ b/do_text.c
@@ -0,0 +1,411 @@
+/* $Xorg: do_text.c,v 1.4 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static char **charBuf;
+static XFontStruct *font, *bfont;
+static int height, ypos;
+static XTextItem *items;
+static int charsPerLine, totalLines;
+
+#define XPOS 20
+#define SEGS 3
+
+
+int InitText(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j;
+ char ch;
+ XGCValues gcv;
+
+ font = XLoadQueryFont(xp->d, p->font);
+ if (font == NULL) {
+ printf("Could not load font '%s', benchmark omitted\n", p->font);
+ return 0;
+ }
+
+ bfont = NULL;
+ if (p->bfont != NULL) {
+ bfont = XLoadQueryFont(xp->d, p->bfont);
+ if (bfont == NULL) {
+ printf("Could not load font '%s', benchmark omitted\n", p->bfont);
+ return 0;
+ }
+ }
+
+ ypos = XPOS;
+ height = (font->max_bounds.ascent + font->max_bounds.descent) + 1;
+ if (bfont != NULL) {
+ int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1;
+ if (h > height)
+ height = h;
+ }
+ gcv.font = font->fid;
+ XChangeGC(xp->d, xp->fggc, GCFont, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCFont, &gcv);
+
+ charsPerLine = p->objects;
+ charsPerLine = (charsPerLine + 3) & ~3;
+ p->objects = charsPerLine;
+
+ totalLines = '\177' - ' ' + 1;
+ if (totalLines > reps) totalLines = reps;
+
+ charBuf = (char **) malloc(totalLines*sizeof (char *));
+ if (p->special)
+ items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem));
+
+ for (i = 0; i != totalLines; i++) {
+ charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine);
+ ch = i + ' ';
+ for (j = 0; j != charsPerLine; j++) {
+ charBuf[i][j] = ch;
+ if (ch == '\177') ch = ' '; else ch++;
+ }
+ if (p->special) {
+ items[i*SEGS+0].chars = &(charBuf[i][0]);
+ items[i*SEGS+0].nchars = charsPerLine/4;
+ items[i*SEGS+0].delta = 0;
+ items[i*SEGS+0].font = font->fid;
+ items[i*SEGS+1].chars = &(charBuf[i][charsPerLine/4]);
+ items[i*SEGS+1].nchars = charsPerLine/2;
+ items[i*SEGS+1].delta = 3;
+ items[i*SEGS+1].font = bfont->fid;
+ items[i*SEGS+2].chars = &(charBuf[i][3*charsPerLine/4]);
+ items[i*SEGS+2].nchars = charsPerLine/4;
+ items[i*SEGS+2].delta = 3;
+ items[i*SEGS+2].font = font->fid;
+ }
+ }
+ return reps;
+}
+
+
+#define GetRealChar(font, totalChars, ch) \
+{ \
+ XCharStruct *pci; \
+ do { \
+ ch--; \
+ if (ch < 0) { \
+ ch = totalChars-1; \
+ } \
+ if (font->per_char == NULL) break; \
+ pci = &(font->per_char[ch]); \
+ } while ( (pci->lbearing | pci->rbearing | pci->width \
+ | pci->ascent | pci->descent | pci->attributes) == 0); \
+} /* GetRealChar */
+
+int InitText16(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ register int i, j;
+ register char *pbuf0, *pbuf1, *pbuf2;
+ XGCValues gcv;
+ int rows, columns, totalChars, ch;
+ int brows, bcolumns, btotalChars, bch;
+
+ font = XLoadQueryFont(xp->d, p->font);
+ if (font == NULL) {
+ printf("Could not load font '%s', benchmark omitted\n", p->font);
+ return 0;
+ }
+ rows = font->max_byte1 - font->min_byte1 + 1;
+ columns = font->max_char_or_byte2 - font->min_char_or_byte2 + 1;
+ totalChars = rows * columns;
+ totalLines = rows;
+ ch = totalChars;
+
+ bfont = NULL;
+ if (p->bfont != NULL) {
+ bfont = XLoadQueryFont(xp->d, p->bfont);
+ if (bfont == NULL) {
+ printf("Could not load font '%s', benchmark omitted\n", p->bfont);
+ return 0;
+ }
+ brows = bfont->max_byte1 - bfont->min_byte1 + 1;
+ bcolumns = bfont->max_char_or_byte2 - bfont->min_char_or_byte2 + 1;
+ btotalChars = brows * bcolumns;
+ bch = btotalChars;
+ if (brows > totalLines) totalLines = brows;
+ }
+
+ ypos = XPOS;
+ height = (font->max_bounds.ascent + font->max_bounds.descent) + 1;
+ if (bfont != NULL) {
+ int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1;
+ if (h > height)
+ height = h;
+ }
+ gcv.font = font->fid;
+ XChangeGC(xp->d, xp->fggc, GCFont, &gcv);
+ XChangeGC(xp->d, xp->bggc, GCFont, &gcv);
+
+ charsPerLine = p->objects;
+
+ if (totalLines > reps) totalLines = reps;
+
+ if (p->special) {
+ charsPerLine = (charsPerLine + 3) & ~3; /* make a multiple of four */
+ p->objects = charsPerLine;
+
+ items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem));
+
+ for (i = 0; i < totalLines; i++) {
+ pbuf0 = items[i*SEGS+0].chars =
+ (char *) malloc (sizeof (char)*charsPerLine/2);
+ items[i*SEGS+0].nchars = charsPerLine/4;
+ items[i*SEGS+0].delta = 0;
+ items[i*SEGS+0].font = font->fid;
+ pbuf1 = items[i*SEGS+1].chars =
+ (char *) malloc (sizeof (char)*charsPerLine);
+ items[i*SEGS+1].nchars = charsPerLine/2;
+ items[i*SEGS+1].delta = 3;
+ items[i*SEGS+1].font = bfont->fid;
+ pbuf2 = items[i*SEGS+2].chars =
+ (char *) malloc (sizeof (char)*charsPerLine/2);
+ items[i*SEGS+2].nchars = charsPerLine/4;
+ items[i*SEGS+2].delta = 3;
+ items[i*SEGS+2].font = font->fid;
+ for (j = 0; j < charsPerLine/4; j++) {
+ GetRealChar(font, totalChars, ch);
+ *pbuf0++ = ch / columns + font->min_byte1;
+ *pbuf0++ = ch % columns + font->min_char_or_byte2;
+ GetRealChar(font, totalChars, ch);
+ *pbuf2++ = ch / columns + font->min_byte1;
+ *pbuf2++ = ch % columns + font->min_char_or_byte2;
+ }
+ for (j = 0; j < charsPerLine/2; j++) {
+ GetRealChar(bfont, btotalChars, bch);
+ *pbuf1++ = bch / bcolumns + bfont->min_byte1;
+ *pbuf1++ = bch % bcolumns + bfont->min_char_or_byte2;
+ }
+ }
+ } else {
+ charBuf = (char **) malloc(totalLines*sizeof (char *));
+ for (i = 0; i < totalLines; i++) {
+ pbuf0 = charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine*2);
+ for (j = 0; j < charsPerLine; j++) {
+ GetRealChar(font, totalChars, ch);
+ *pbuf0++ = ch / columns + font->min_byte1;
+ *pbuf0++ = ch % columns + font->min_char_or_byte2;
+ }
+ }
+ }
+ return reps;
+}
+
+void DoText(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i != reps; i++) {
+ XDrawString(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ line = startLine;
+ startLine = (startLine + 1) % totalLines;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void DoText16(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i < reps; i++) {
+ XDrawString16(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ line = startLine;
+ startLine = (startLine + 1) % totalLines;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void DoPolyText(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i != reps; i++) {
+ XDrawText(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, &items[line*SEGS], SEGS);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ line = startLine;
+ startLine = (startLine + 1) % totalLines;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void DoPolyText16(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i != reps; i++) {
+ XDrawText16(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, (XTextItem16 *)&items[line*SEGS], SEGS);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ line = startLine;
+ startLine = (startLine + 1) % totalLines;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void DoImageText(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i != reps; i++) {
+ XDrawImageString(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ startLine = (startLine + 17) % totalLines;
+ line = startLine;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void DoImageText16(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, line, startLine;
+
+ startLine = 0;
+ line = 0;
+ for (i = 0; i != reps; i++) {
+ XDrawImageString16(
+ xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine);
+ ypos += height;
+ if (ypos > HEIGHT - height) {
+ /* Wraparound to top of window */
+ ypos = XPOS;
+ startLine = (startLine + 17) % totalLines;
+ line = startLine;
+ }
+ line = (line + 1) % totalLines;
+ }
+}
+
+void ClearTextWin(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XClearWindow(xp->d, xp->w);
+}
+
+void EndText(xp, p)
+ XParms xp;
+ Parms p;
+{
+ int i;
+
+ if(font==NULL)return;
+ for (i = 0; i != totalLines; i++)
+ free(charBuf[i]);
+ free(charBuf);
+ if (p->special)
+ free(items);
+ XFreeFont(xp->d, font);
+ if (bfont != NULL)
+ XFreeFont(xp->d, bfont);
+}
+
+void EndText16(xp, p)
+ XParms xp;
+ Parms p;
+{
+ int i;
+
+ if(font==NULL)return;
+ if (p->special) {
+ for (i = 0; i < totalLines; i++) {
+ free(items[i*SEGS+0].chars);
+ free(items[i*SEGS+1].chars);
+ free(items[i*SEGS+2].chars);
+ }
+ free(items);
+ } else {
+ for (i = 0; i < totalLines; i++) {
+ free(charBuf[i]);
+ }
+ free(charBuf);
+ }
+ XFreeFont(xp->d, font);
+ if(bfont != NULL) {
+ XFreeFont(xp->d, bfont);
+ }
+}
+
diff --git a/do_traps.c b/do_traps.c
new file mode 100644
index 0000000..5605ff3
--- /dev/null
+++ b/do_traps.c
@@ -0,0 +1,111 @@
+/* $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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+#include "bitmaps.h"
+
+#define NUM_POINTS 4 /* 4 points to a trapezoid */
+static XPoint *points;
+static GC pgc;
+
+int InitTrapezoids(xp, p, reps)
+ 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(xp, p, reps)
+ 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;
+ }
+}
+
+void EndTrapezoids(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(points);
+}
+
diff --git a/do_tris.c b/do_tris.c
new file mode 100644
index 0000000..836c6ef
--- /dev/null
+++ b/do_tris.c
@@ -0,0 +1,239 @@
+/* $Xorg: do_tris.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.
+
+******************************************************************************/
+
+
+#undef POLYTRIANGLE_HACK /* don't use this code */
+#ifdef POLYTRIANGLE_HACK
+#include <X11/Xlibint.h>
+#endif
+
+#include "x11perf.h"
+#include "bitmaps.h"
+#include <stdio.h>
+#include <math.h>
+
+#define NUM_POINTS 3 /* 3 points to a triangle */
+static XPoint *points;
+static GC pgc;
+
+#ifndef PI
+#define PI 3.14159265357989
+#endif
+
+double Area(p1, p2, p3)
+ XPoint p1, p2, p3;
+{
+ return
+ (p1.x*p2.y - p1.x*p3.y + p2.x*p3.y - p2.x*p1.y + p3.x*p1.y - p3.x*p2.y)/2;
+}
+
+double Distance(p1, p2)
+ XPoint p1, p2;
+{
+ return sqrt((float) ((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)));
+}
+
+int InitTriangles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j, numPoints;
+ int rows;
+ int x, y;
+ int size, iradius;
+ double phi, phiinc, radius, delta, phi2, area, aarea;
+ XPoint *curPoint;
+
+ pgc = xp->fggc;
+
+ size = p->special;
+ phi = 0.0;
+ delta = 2.0 * PI / ((double) NUM_POINTS);
+ if (xp->version == VERSION1_2) {
+ radius = ((double) size) * sqrt(3.0)/2.0;
+ phiinc = delta/10.0;
+ } else {
+ /* Version 1.2's radius computation was completely bogus, and resulted
+ in triangles with sides about 50% longer than advertised. However,
+ this inadvertently resulted in triangles with areas just a little bit
+ smaller than the triangle that covers size^2 pixels, which would
+ make the area directly comparable to 10x10 rectangles and 10x10
+ trapezoids. So here's the new computation so -triangleN has the same
+ area as -rectN.
+ */
+ radius = ((double) size) * sqrt(sqrt(16.0/27.0));
+ phiinc = 1.75*PI / ((double) p->objects);
+ }
+ iradius = (int) (radius + 0.5);
+
+ numPoints = (p->objects) * NUM_POINTS;
+ points = (XPoint *)malloc(numPoints * sizeof(XPoint));
+ curPoint = points;
+ x = iradius;
+ y = iradius;
+ rows = 0;
+ aarea = 0.0;
+
+ for (i = 0; i != p->objects; i++) {
+ for (j = 0; j != NUM_POINTS; j++) {
+ phi2 = phi + ((double) j) * delta;
+ curPoint->x = (int) ((double)x + (radius * cos(phi2)) + 0.5);
+ curPoint->y = (int) ((double)y + (radius * sin(phi2)) + 0.5);
+ curPoint++;
+ }
+ area = Area(curPoint[-1], curPoint[-2], curPoint[-3]);
+ aarea += area;
+/* printf("%6.1lf %6.1lf %6.1lf %6.1lf\n",
+ Distance(curPoint[-1], curPoint[-2]),
+ Distance(curPoint[-1], curPoint[-3]),
+ Distance(curPoint[-2], curPoint[-3]),
+ area);
+*/
+ phi += phiinc;
+ y += 2 * iradius;
+ rows++;
+ if (y + iradius > HEIGHT || rows == MAXROWS) {
+ rows = 0;
+ y = iradius;
+ x += 2 * iradius;
+ if (x + iradius > WIDTH) {
+ x = iradius;
+ }
+ }
+ }
+/* printf("Average area = %6.2lf\n", aarea/p->objects); */
+
+ SetFillStyle(xp, p);
+
+ return reps;
+}
+
+#ifndef POLYTRIANGLE_HACK
+
+void DoTriangles(xp, p, reps)
+ 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;
+ }
+}
+
+#else
+void DoTriangles(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i, j;
+ XPoint *curPoint;
+
+ for (i = 0; i != reps; i++) {
+ XPolyTriangle (xp->d, xp->w, pgc, points, p->objects, Convex,
+ CoordModeOrigin);
+ if (pgc == xp->bggc)
+ pgc = xp->fggc;
+ else
+ pgc = xp->bggc;
+ }
+}
+
+static xReq _dummy_request = {
+ 0, 0, 0
+};
+
+XPolyTriangle(dpy, d, gc, points, n_triangles, shape, mode)
+register Display *dpy;
+Drawable d;
+GC gc;
+XPoint *points;
+int n_triangles;
+int shape;
+int mode;
+{
+ register xFillPolyReq *req;
+ register long nbytes;
+ int max_triangles;
+ int n_this_time;
+ int *buf, *pts;
+ int gcid;
+ int last;
+
+ max_triangles = (dpy->bufmax - dpy->buffer) / 28;
+ LockDisplay(dpy);
+ FlushGC(dpy, gc);
+ dpy->request += n_triangles;
+ pts = (int *) points;
+ gcid = gc->gid;
+ last = shape | (mode << 8);
+ while (n_triangles)
+ {
+ if ((n_this_time = max_triangles) > n_triangles)
+ n_this_time = n_triangles;
+ n_triangles -= n_this_time;
+ GetReqExtra(FillPoly,
+ (SIZEOF(xFillPolyReq) + 12) * n_this_time - SIZEOF(xFillPolyReq), req);
+ --dpy->request;
+
+ buf = req;
+ while (n_this_time--)
+ {
+ buf[0] = X_FillPoly | (7 << 16);
+ buf[1] = d;
+ buf[2] = gcid;
+ buf[3] = last;
+ buf[4] = pts[0];
+ buf[5] = pts[1];
+ buf[6] = pts[2];
+ buf += 7;
+ pts += 3;
+ }
+ }
+ dpy->last_req = &_dummy_request;
+ UnlockDisplay(dpy);
+ SyncHandle();
+}
+#endif
+
+void EndTriangles(xp, p)
+ XParms xp;
+ Parms p;
+{
+ free(points);
+}
+
diff --git a/do_valgc.c b/do_valgc.c
new file mode 100644
index 0000000..c458c2f
--- /dev/null
+++ b/do_valgc.c
@@ -0,0 +1,81 @@
+/* $Xorg: do_valgc.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.
+
+******************************************************************************/
+
+#ifndef VMS
+#include <X11/Xatom.h>
+#else
+#include <decw$include/Xatom.h>
+#endif
+#include "x11perf.h"
+
+static Window win[2];
+
+int InitGC(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ win[0] = XCreateSimpleWindow(
+ xp->d, xp->w, 10, 10, 10, 10, 1, xp->foreground, xp->background);
+ win[1] = XCreateSimpleWindow(
+ xp->d, xp->w, 30, 30, 10, 10, 1, xp->foreground, xp->background);
+ XMapSubwindows(xp->d, xp->w);
+ return reps;
+}
+
+void DoChangeGC(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ XGCValues gcv;
+
+ for (i = 0; i != reps; i++) {
+ gcv.foreground = xp->foreground;
+ XChangeGC(xp->d, xp->fggc, GCForeground , &gcv);
+ XDrawPoint(xp->d, win[0], xp->fggc, 5, 5);
+
+ gcv.foreground = xp->background;
+ XChangeGC(xp->d, xp->fggc, GCForeground , &gcv);
+ XDrawPoint(xp->d, win[1], xp->fggc, 5, 5);
+
+ gcv.foreground = xp->background;
+ XChangeGC(xp->d, xp->fggc, GCForeground , &gcv);
+ XDrawPoint(xp->d, win[0], xp->fggc, 5, 5);
+
+ gcv.foreground = xp->foreground;
+ XChangeGC(xp->d, xp->fggc, GCForeground , &gcv);
+ XDrawPoint(xp->d, win[1], xp->fggc, 5, 5);
+ }
+}
+
+void EndGC(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroyWindow(xp->d, win[0]);
+ XDestroyWindow(xp->d, win[1]);
+}
+
diff --git a/do_windows.c b/do_windows.c
new file mode 100644
index 0000000..c6b386d
--- /dev/null
+++ b/do_windows.c
@@ -0,0 +1,289 @@
+/* $Xorg: do_windows.c,v 1.4 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.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static Window *parents;
+static Window *isolates;
+static int childrows, childcolumns, childwindows;
+static int parentrows, parentcolumns, parentwindows;
+static int parentwidth, parentheight;
+static Window popup;
+
+void ComputeSizes(xp, p)
+ XParms xp;
+ Parms p;
+{
+ childwindows = p->objects;
+ childrows = (childwindows + MAXCOLS - 1) / MAXCOLS;
+ childcolumns = (childrows > 1 ? MAXCOLS : childwindows);
+
+ parentwidth = (CHILDSIZE+CHILDSPACE) * childcolumns;
+ parentheight = (CHILDSIZE+CHILDSPACE) * childrows;
+}
+
+int CreateParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ ComputeSizes(xp, p);
+
+ parentcolumns = WIDTH / parentwidth;
+ parentrows = HEIGHT / parentheight;
+ parentwindows = parentcolumns * parentrows; /* Max reps we can fit */
+
+ if (parentwindows > reps) {
+ parentwindows = reps;
+ }
+
+ /* We will do parentwindows sets of childwindows, in order to get better
+ timing accuracy. Creating 4 windows at a millisecond apiece or so
+ is a bit faster than the 60 Hz clock. */
+ isolates = (Window *)malloc(parentwindows * sizeof(Window));
+ parents = (Window *)malloc(parentwindows * sizeof(Window));
+
+ /*
+ * Create isolation windows for the parents, and then the parents
+ * themselves. These isolation windows ensure that parent and children
+ * windows created/mapped in DoWins and DoWin2 all see the same local
+ * environment...the parent is an only child, and each parent contains
+ * the number of children we are trying to get benchmarks on.
+ */
+
+ for (i = 0; i != parentwindows; i++) {
+ isolates[i] = XCreateSimpleWindow(xp->d, xp->w,
+ (i/parentrows)*parentwidth, (i%parentrows)*parentheight,
+ parentwidth, parentheight, 0, xp->background, xp->background);
+ parents[i] = XCreateSimpleWindow(xp->d, isolates[i],
+ 0, 0, parentwidth, parentheight, 0, xp->background, xp->background);
+ }
+
+ XMapSubwindows(xp->d, xp->w);
+ return parentwindows;
+} /* CreateParents */
+
+
+void MapParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XMapWindow(xp->d, parents[i]);
+ }
+}
+
+
+int InitCreate(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ MapParents(xp, p, reps);
+ return reps;
+}
+
+void CreateChildGroup(xp, p, parent)
+ XParms xp;
+ Parms p;
+ Window parent;
+{
+ int j;
+
+ for (j = 0; j != childwindows; j++) {
+ (void) XCreateSimpleWindow (xp->d, parent,
+ (CHILDSIZE+CHILDSPACE) * (j/childrows) + CHILDSPACE/2,
+ (CHILDSIZE+CHILDSPACE) * (j%childrows) + CHILDSPACE/2,
+ CHILDSIZE, CHILDSIZE, 0, xp->background, xp->foreground);
+ }
+
+ if (p->special)
+ XMapSubwindows (xp->d, parent);
+}
+
+void CreateChildren(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ CreateChildGroup(xp, p, parents[i]);
+ } /* end i */
+}
+
+void DestroyChildren(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XDestroySubwindows(xp->d, parents[i]);
+ }
+}
+
+void EndCreate(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+ free(parents);
+ free(isolates);
+}
+
+
+int InitMap(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ CreateChildren(xp, p, reps);
+ return reps;
+}
+
+void UnmapParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XUnmapWindow(xp->d, parents[i]);
+ }
+}
+
+int InitDestroy(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ CreateChildren(xp, p, reps);
+ MapParents(xp, p, reps);
+ return reps;
+}
+
+void DestroyParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XDestroyWindow(xp->d, parents[i]);
+ }
+}
+
+
+void RenewParents(xp, p)
+ XParms xp;
+ Parms p;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ parents[i] = XCreateSimpleWindow(xp->d, isolates[i],
+ 0, 0, parentwidth, parentheight, 0, xp->background, xp->background);
+ }
+ CreateChildren(xp, p, parentwindows);
+ MapParents(xp, p, parentwindows);
+}
+
+int InitPopups(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+#ifdef CHILDROOT
+ XWindowAttributes xwa;
+#endif
+ XSetWindowAttributes xswa;
+ Window isolate;
+
+#ifdef CHILDROOT
+ ComputeSizes(xp, p);
+ CreateChildGroup(xp, p, xp->w);
+
+ /* Now create simple window to pop up over children */
+ (void) XGetWindowAttributes(xp->d, xp->w, &xwa);
+ xswa.override_redirect = True;
+ popup = XCreateSimpleWindow (
+ xp->d, DefaultRootWindow(xp->d),
+ xwa.x + xwa.border_width, xwa.y + xwa.border_width,
+ parentwidth, parentheight,
+ 0, xp->foreground, xp->foreground);
+#else
+ isolate = XCreateSimpleWindow(
+ xp->d, xp->w, 0, 0, WIDTH, HEIGHT,
+ 0, xp->background, xp->background);
+
+ ComputeSizes(xp, p);
+ CreateChildGroup(xp, p, isolate);
+ XMapWindow(xp->d, isolate);
+
+ /* Now create simple window to pop up over children */
+ xswa.override_redirect = True;
+ popup = XCreateSimpleWindow (
+ xp->d, xp->w, 0, 0,
+ parentwidth, parentheight,
+ 0, xp->foreground, xp->foreground);
+#endif
+ XChangeWindowAttributes (xp->d, popup, CWOverrideRedirect, &xswa);
+ return reps;
+}
+
+void DoPopUps(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ for (i = 0; i != reps; i++) {
+ XMapWindow(xp->d, popup);
+ XUnmapWindow(xp->d, popup);
+ }
+}
+
+void EndPopups(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+#ifdef CHILDROOT
+ XDestroyWindow(xp->d, popup);
+#endif
+}
+
diff --git a/fillblnk b/fillblnk
new file mode 100644
index 0000000..dbd2ec1
--- /dev/null
+++ b/fillblnk
@@ -0,0 +1,15 @@
+#!/bin/sh
+echo '#####EOF#####' | cat $2 - $1 |
+awk -F: '\
+$1 == "#####EOF#####" { filling = 1; currentItem = 1; lastItem = NR; next; }
+filling != "1" { itemOrder[" " $1] = NR; name[NR] = $1; }
+filling == "1" { rate[itemOrder[$2]] = $1; }
+END {
+ for (i = 1; i < lastItem; i++) {
+ if (rate[i] != "") {
+ printf ("%s: %s\n", rate[i], name[i]);
+ } else {
+ printf (" 0 trep @ 0.0 msec (0.0/sec): %s\n", name[i]);
+ }
+ }
+ }'
diff --git a/perfboth b/perfboth
new file mode 100644
index 0000000..f529841
--- /dev/null
+++ b/perfboth
@@ -0,0 +1,40 @@
+#!/bin/sh
+awk '
+/^ 1/ && READY == 0 { printf (" 1 ");
+ for (i = 2; i < NF; i++)
+ printf (" %2d ", i);
+ printf (" Operation\n");
+ next;
+ }
+/^---/ { printf ("--------");
+ for (i = 2; i <= NF; i++)
+ printf (" -----------------");
+ printf ("\n");
+ READY=1; next;
+ }
+READY==1 {
+ base=$1;
+ printf ("%8.1f", base);
+ for (i = 2; i < '$1'; i++) {
+ if (base == 0)
+ printf (" %8.1f ", $i);
+ else {
+ rate=$i/base;
+ if (rate < .1)
+ printf (" %8.1f (%6.3f)", $i, rate);
+ else if (rate < 1000)
+ printf (" %8.1f (%6.2f)", $i, rate);
+ else
+ printf (" %8.1f (%6.0f)", $i, rate);
+ }
+ }
+ printf (" ");
+ for (; i <= NF; i++)
+ {
+ printf ("%s ", $i);
+ }
+ printf ("\n");
+ next;
+ }
+ { print $0; }
+'
diff --git a/perfratio b/perfratio
new file mode 100644
index 0000000..6ff3a12
--- /dev/null
+++ b/perfratio
@@ -0,0 +1,40 @@
+#!/bin/sh
+awk '
+/^ 1/ && READY == 0 { printf (" 1 ");
+ for (i = 2; i < NF; i++)
+ printf (" %2d ", i);
+ printf (" Operation\n");
+ next;
+ }
+/^---/ { printf ("--------");
+ for (i = 2; i < NF; i++)
+ printf (" ------");
+ printf (" ---------\n");
+ READY=1; next;
+ }
+READY==1 {
+ base=$1;
+ printf ("%8.1f", base);
+ for (i = 2; i < '$1'; i++) {
+ if (base == 0)
+ printf (" lots ", $i);
+ else {
+ rate=$i/base;
+ if (rate < .1)
+ printf (" %6.3f", rate);
+ else if (rate < 1000)
+ printf (" %6.2f", rate);
+ else
+ printf (" %6.0f", rate);
+ }
+ }
+ printf (" ");
+ for (; i <= NF; i++)
+ {
+ printf ("%s ", $i);
+ }
+ printf ("\n");
+ next;
+ }
+ { print $0; }
+'
diff --git a/x11pcomp.cpp b/x11pcomp.cpp
new file mode 100644
index 0000000..cbfc24e
--- /dev/null
+++ b/x11pcomp.cpp
@@ -0,0 +1,100 @@
+XCOMM! /bin/sh
+XCOMM Collects multiple outputs of x11perf. Just feed it a list of files, each
+XCOMM containing the output from an x11perf run, and this shell will extract the
+XCOMM object/second information and show it in tabular form. An 80-column line
+XCOMM is big enough to compare 4 different servers.
+XCOMM
+XCOMM This script normally uses the results from $1 to extract the test label
+XCOMM descriptions, so you can run x11perf on a subset of the test and then
+XCOMM compare the results. But note that x11perffill requires the labels file
+XCOMM to be a superset of the x11perf results file. If you run into an ugly
+XCOMM situation in which none of the servers completes the desired tests
+XCOMM (quite possible on non-DEC servers :), you can use -l <filename> as $1 and
+XCOMM $2 to force x11perfcomp to use the labels stored in file $2. (You can run
+XCOMM x11perf with the -labels option to generate such a file.)
+XCOMM
+XCOMM Mark Moraes, University of Toronto <moraes@csri.toronto.edu>
+XCOMM Joel McCormack, DEC Western Research Lab <joel@decwrl.dec.com>
+XCOMM
+XCOMM $Xorg: x11pcomp.cpp,v 1.3 2000/08/17 19:54:10 cpqbld Exp $
+
+PATH=LIBPATH:.:$PATH
+export PATH
+
+set -e
+tmp=/tmp/rates.$$
+trap "rm -rf $tmp" 0 1 2 15
+mkdir $tmp $tmp/rates
+ratio=
+allfiles=
+XCOMM Include relative rates in output? Report only relative rates?
+case $1 in
+-r|-a)
+ ratio=1
+ shift;
+ ;;
+-ro)
+ ratio=2
+ shift;
+ ;;
+esac
+XCOMM Get either the provided label file, or construct one from all the
+XCOMM files given.
+case $1 in
+-l) cp $2 $tmp/labels
+ shift; shift
+ ;;
+*) for file in "$@"; do
+ awk '$2 == "reps" || $2 == "trep" { print $0; next; }' $file |
+ sed 's/^.*: //' |
+ sed 's/ /_/g' |
+ awk 'NR > 1 { printf ("%s %s\n", prev, $0); } \
+ { prev = $0; }'
+ done | tsort 2>/dev/null | sed 's/_/ /g' > $tmp/labels
+ ;;
+esac
+XCOMM Go through all files, and create a corresponding rate file for each
+n=1
+for i
+do
+XCOMM Get lines with average numbers, fill in any tests that may be missing
+XCOMM then extract the rate field
+ base=`basename $i`
+ (echo " $n "
+ echo '--------'
+ awk '$2 == "reps" || $2 == "trep" { \
+ line = $0; \
+ next; \
+ } \
+ NF == 0 && line != "" { \
+ print line; \
+ line=""; \
+ next; \
+ } \
+ ' $i > $tmp/$n.avg
+ fillblnk $tmp/$n.avg $tmp/labels |
+ sed 's/( *\([0-9]*\)/(\1/' |
+ awk '$2 == "reps" || $2 == "trep" { \
+ n = substr($6,2,length($6)-7); \
+ printf "%8s\n", n; \
+ }'
+ ) > $tmp/rates/$n
+ echo "$n: $i"
+ allfiles="$allfiles$tmp/rates/$n "
+ n=`expr $n + 1`
+done
+case x$ratio in
+x)
+ ratio=/bin/cat
+ ;;
+x1)
+ ratio="perfboth $n"
+ ;;
+*)
+ ratio="perfratio $n"
+ ;;
+esac
+echo ''
+(echo Operation; echo '---------'; cat $tmp/labels) |
+paste $allfiles - | sed 's/ / /g' | $ratio
+rm -rf $tmp
diff --git a/x11perf.c b/x11perf.c
new file mode 100644
index 0000000..7bff401
--- /dev/null
+++ b/x11perf.c
@@ -0,0 +1,1451 @@
+/* $Xorg: x11perf.c,v 1.6 2001/01/23 17:21:42 pookie 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.
+
+****************************************************************************/
+
+#include <stdio.h>
+#include <ctype.h>
+#include <signal.h>
+
+#ifndef VMS
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#else
+#include <decw$include/Xatom.h>
+#endif
+#include "x11perf.h"
+#include <X11/Xmu/SysUtil.h>
+
+#ifdef X_NOT_STDC_ENV
+#define Time_t long
+extern Time_t time ();
+#else
+#include <time.h>
+#define Time_t time_t
+#endif
+
+/* Only for working on ``fake'' servers, for hardware that doesn't exist */
+static Bool drawToFakeServer = False;
+static Pixmap tileToQuery = None;
+
+typedef struct _RopNames { char *name; int rop; } RopNameRec, *RopNamePtr;
+
+RopNameRec ropNames[] = {
+ "clear", GXclear, /* 0 */
+ "and", GXand, /* src AND dst */
+ "andReverse", GXandReverse, /* src AND NOT dst */
+ "copy", GXcopy, /* src */
+ "andInverted", GXandInverted, /* NOT src AND dst */
+ "noop", GXnoop, /* dst */
+ "xor", GXxor, /* src XOR dst */
+ "or", GXor, /* src OR dst */
+ "nor", GXnor, /* NOT src AND NOT dst */
+ "equiv", GXequiv, /* NOT src XOR dst */
+ "invert", GXinvert, /* NOT dst */
+ "orReverse", GXorReverse, /* src OR NOT dst */
+ "copyInverted", GXcopyInverted, /* NOT src */
+ "orInverted", GXorInverted, /* NOT src OR dst */
+ "nand", GXnand, /* NOT src OR NOT dst */
+ "set", GXset, /* 1 */
+};
+
+char *(visualClassNames)[] = {
+ "StaticGray",
+ "GrayScale",
+ "StaticColor",
+ "PseudoColor",
+ "TrueColor",
+ "DirectColor"
+};
+
+static Bool labels = False;
+static int repeat = 5;
+static int seconds = 5;
+
+static Window status; /* Status window and GC */
+static GC tgc;
+static int HSx, HSy;
+
+static double syncTime = 0.0;
+
+static int saveargc;
+static char **saveargv;
+
+static int numRops = 1;
+static int rops[16] = { GXcopy };
+static int numPlanemasks = 1;
+static unsigned long planemasks[256] = { (unsigned long)~0 };
+
+static char *foreground = NULL;
+static char *background = NULL;
+static char *ddbackground = NULL;
+static int clips = 0;
+
+static int numSubWindows = 7;
+static unsigned long subWindows[] = {4, 16, 25, 50, 75, 100, 200, 0};
+
+static int fixedReps = 0;
+
+static Bool *doit;
+
+static XRectangle ws[] = { /* Clip rectangles */
+ {195, 195, 120, 120},
+ { 45, 145, 120, 120},
+ {345, 245, 120, 120},
+ { 45, 275, 120, 120},
+ {345, 115, 120, 120},
+ {195, 325, 120, 120}
+
+};
+#define MAXCLIP (sizeof(ws) / sizeof(ws[0]))
+static Window clipWindows[MAXCLIP];
+static Colormap cmap;
+static int depth = -1; /* -1 means use default depth */
+static int vclass = -1; /* -1 means use CopyFromParent */
+static Visual *visual = CopyFromParent;
+
+/* ScreenSaver state */
+static XParmRec xparms;
+static int ssTimeout, ssInterval, ssPreferBlanking, ssAllowExposures;
+
+
+/************************************************
+* time related stuff *
+************************************************/
+
+#ifdef VMS
+
+typedef struct _vms_time {
+ unsigned long low;
+ unsigned long high;
+}vms_time;
+
+struct timeval {
+ long tv_sec; /* seconds since Jan. 1, 1970 */
+ long tv_usec; /* and microseconds */
+};
+
+struct timezone {
+ int tz_minuteswest; /* of Greenwich */
+ int tz_dsttime; /* type of dst correction to apply */
+};
+
+
+static int firsttime = True;
+static vms_time basetime;
+
+int gettimeofday(tp)
+ struct timeval *tp;
+{
+ vms_time current_time, resultant;
+ unsigned long mumble, foo;
+ int status;
+
+ if (firsttime) {
+ sys$gettim(&basetime);
+ firsttime = False;
+ }
+ sys$gettim(&current_time);
+ resultant.high = current_time.high - basetime.high;
+ resultant.low = current_time.low - basetime.low;
+ if (current_time.low < basetime.low) {
+ resultant.high -= 1;
+ }
+ status = lib$ediv( &(10000000), &resultant, &tp->tv_sec, &tp->tv_usec);
+ tp->tv_usec /= 10;
+ return 0;
+}
+
+#endif
+
+static struct timeval start;
+
+void PrintTime()
+{
+ Time_t t;
+
+ t = time((Time_t *)NULL);
+ printf("%s\n", ctime(&t));
+}
+
+void InitTimes ()
+{
+ X_GETTIMEOFDAY(&start);
+}
+
+double ElapsedTime(correction)
+ double correction;
+{
+ struct timeval stop;
+
+ X_GETTIMEOFDAY(&stop);
+ if (stop.tv_usec < start.tv_usec) {
+ stop.tv_usec += 1000000;
+ stop.tv_sec -= 1;
+ }
+ return (double)(stop.tv_usec - start.tv_usec) +
+ (1000000.0 * (double)(stop.tv_sec - start.tv_sec)) - correction;
+}
+
+double RoundTo3Digits(d)
+ double d;
+{
+ /* It's kind of silly to print out things like ``193658.4/sec'' so just
+ junk all but 3 most significant digits. */
+
+ double exponent, sign;
+
+ exponent = 1.0;
+ /* the code below won't work if d should happen to be non-positive. */
+ if (d < 0.0) {
+ d = -d;
+ sign = -1.0;
+ } else
+ sign = 1.0;
+ if (d >= 1000.0) {
+ do {
+ exponent *= 10.0;
+ } while (d/exponent >= 1000.0);
+ d = (double)((int) (d/exponent + 0.5));
+ d *= exponent;
+ } else {
+ if (d != 0.0) {
+ while (d*exponent < 100.0) {
+ exponent *= 10.0;
+ }
+ }
+ d = (double)((int) (d*exponent + 0.5));
+ d /= exponent;
+ }
+ return d * sign;
+}
+
+
+void ReportTimes(usecs, n, str, average)
+ double usecs;
+ int n;
+ char *str;
+{
+ double msecsperobj, objspersec;
+
+ if(usecs != 0.0)
+ {
+ msecsperobj = usecs / (1000.0 * (double)n);
+ objspersec = (double) n * 1000000.0 / usecs;
+
+ /* Round obj/sec to 3 significant digits. Leave msec untouched, to
+ allow averaging results from several repetitions. */
+ objspersec = RoundTo3Digits(objspersec);
+
+ if (average) {
+ printf("%7d trep @ %8.4f msec (%8.1f/sec): %s\n",
+ n, msecsperobj, objspersec, str);
+ } else {
+ printf("%7d reps @ %8.4f msec (%8.1f/sec): %s\n",
+ n, msecsperobj, objspersec, str);
+ }
+ } else {
+ printf("%6d %sreps @ 0.0 msec (unmeasurably fast): %s\n",
+ n, average ? "t" : "", str);
+ }
+
+}
+
+
+
+/************************************************
+* Generic X stuff *
+************************************************/
+
+static char *program_name;
+void usage();
+
+/*
+ * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete)
+ * If found, remove it from command line. Don't go past a lone -.
+ */
+char *Get_Display_Name(pargc, argv)
+ int *pargc; /* MODIFIED */
+ char **argv; /* MODIFIED */
+{
+ int argc = *pargc;
+ char **pargv = argv+1;
+ char *displayname = NULL;
+ int i;
+
+ for (i = 1; i != argc; i++) {
+ char *arg = argv[i];
+
+ if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) {
+ if (++i >= argc) usage ();
+
+ displayname = argv[i];
+ *pargc -= 2;
+ continue;
+ }
+ if (!strcmp(arg,"-")) {
+ while (i<argc) *pargv++ = argv[i++];
+ break;
+ }
+ *pargv++ = arg;
+ }
+
+ *pargv = NULL;
+ return (displayname);
+}
+
+
+/*
+ * GetVersion (argc, argv) Look for -v1.2, -v1.3, or -v1.4.
+ * If found remove it from command line. Don't go past a lone -.
+ */
+
+Version GetVersion(pargc, argv)
+ int *pargc; /* MODIFIED */
+ char **argv; /* MODIFIED */
+{
+ int argc = *pargc;
+ char **pargv = argv+1;
+ Version version = VERSION1_5;
+ int i;
+ Bool found = False;
+
+ for (i = 1; i != argc; i++) {
+ char *arg = argv[i];
+
+ if (!strcmp (arg, "-v1.2")) {
+ version = VERSION1_2;
+ *pargc -= 1;
+ if (found) {
+ fprintf(stderr, "Warning: multiple version specifications\n");
+ }
+ found = True;
+ continue;
+ }
+ if (!strcmp (arg, "-v1.3")) {
+ version = VERSION1_3;
+ *pargc -= 1;
+ if (found) {
+ fprintf(stderr, "Warning: multiple version specifications\n");
+ }
+ found = True;
+ continue;
+ }
+ if (!strcmp (arg, "-v1.4")) {
+ version = VERSION1_4;
+ *pargc -= 1;
+ if (found) {
+ fprintf(stderr, "Warning: multiple version specifications\n");
+ }
+ found = True;
+ continue;
+ }
+ if (!strcmp(arg,"-")) {
+ while (i<argc) *pargv++ = argv[i++];
+ break;
+ }
+ *pargv++ = arg;
+ }
+
+ *pargv = NULL;
+ return (version);
+}
+
+
+
+/*
+ * Open_Display: Routine to open a display with correct error handling.
+ */
+Display *Open_Display(display_name)
+ char *display_name;
+{
+ Display *d;
+
+ d = XOpenDisplay(display_name);
+ if (d == NULL) {
+ fprintf (stderr, "%s: unable to open display '%s'\n",
+ program_name, XDisplayName (display_name));
+ exit(1);
+ /* doesn't return */
+ }
+
+ return(d);
+}
+
+
+#ifdef SIGNALRETURNSINT
+int
+#else
+void
+#endif
+Cleanup(sig)
+ int sig;
+{
+ fflush(stdout);
+ /* This will screw up if Xlib is in the middle of something */
+ XSetScreenSaver(xparms.d, ssTimeout, ssInterval, ssPreferBlanking,
+ ssAllowExposures);
+ XFlush(xparms.d);
+ exit(sig);
+}
+
+
+/************************************************
+* Performance stuff *
+************************************************/
+
+
+void usage()
+{
+ char **cpp;
+ int i = 0;
+ static char *help_message[] = {
+"where options include:",
+" -display <host:display> the X server to contact",
+" -sync do the tests in synchronous mode",
+" -pack pack rectangles right next to each other",
+" -repeat <n> do tests <n> times (default = 5)",
+" -time <s> do tests for <s> seconds each (default = 5)",
+/*
+" -draw draw after each test -- pmax only",
+*/
+" -all do all tests",
+" -range <test1>[,<test2>] like all, but do <test1> to <test2>",
+" -labels generate test labels for use by fillblnk",
+" -fg the foreground color to use",
+" -bg the background color to use",
+" -clips <default> default number of clip windows per test",
+" -ddbg the background color to use for DoubleDash",
+" -rop <rop0 rop1 ...> use the given rops to draw (default = GXcopy)",
+" -pm <pm0 pm1 ...> use the given planemasks to draw (default = ~0)",
+" -depth <depth> use a visual with <depth> planes per pixel",
+" -vclass <class> the visual class to use (default = root)",
+" -reps <n> fix the rep count (default = auto scale)",
+" -subs <s0 s1 ...> a list of the number of sub-windows to use",
+" -v1.2 perform only v1.2 tests using old semantics",
+" -v1.3 perform only v1.3 tests using old semantics",
+" -su request save unders on windows",
+" -bs <backing_store_hint> WhenMapped or Always (default = NotUseful)",
+NULL};
+
+ fflush(stdout);
+ fprintf(stderr, "usage: %s [-options ...]\n", program_name);
+ for (cpp = help_message; *cpp; cpp++) {
+ fprintf(stderr, "%s\n", *cpp);
+ }
+ while (test[i].option != NULL) {
+ if (test[i].versions & xparms.version ) {
+ fprintf(stderr, " %-24s %s\n",
+ test[i].option,
+ test[i].label14 ? test[i].label14 : test[i].label);
+ }
+ i++;
+ }
+ fprintf(stderr, "\n");
+
+ /* Print out original command line as the above usage message is so long */
+ for (i = 0; i != saveargc; i++) {
+ fprintf(stderr, "%s ", saveargv[i]);
+ }
+ fprintf(stderr, "\n\n");
+ exit (1);
+}
+
+void NullProc(xp, p)
+ XParms xp;
+ Parms p;
+{
+}
+
+Bool NullInitProc(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ return reps;
+}
+
+
+void HardwareSync(xp)
+ XParms xp;
+{
+ /*
+ * Some graphics hardware allows the server to claim it is done,
+ * while in reality the hardware is busily working away. So fetch
+ * a pixel from the drawable that was drawn to, which should be
+ * enough to make the server wait for the graphics hardware.
+ */
+ XImage *image;
+
+ image = XGetImage(xp->d, xp->p ? xp->p : xp->w, HSx, HSy,
+ 1, 1, ~0, ZPixmap);
+ if (image) XDestroyImage(image);
+}
+
+void DoHardwareSync(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != reps; i++) {
+ HardwareSync(xp);
+ }
+}
+
+static Test syncTest = {
+ "syncTime", "Internal test for finding how long HardwareSync takes", NULL,
+ NullInitProc, DoHardwareSync, NullProc, NullProc,
+ V1_2FEATURE, NONROP, 0,
+ {1}
+};
+
+
+static Window CreatePerfWindow(xp, x, y, width, height)
+ XParms xp;
+ int width, height, x, y;
+{
+ XSetWindowAttributes xswa;
+ Window w;
+/*
+ Screen *s;
+ int su;
+
+ s = DefaultScreenOfDisplay(xp->d);
+ su = XDoesBackingStore(s);
+ printf("Backing store of screen returns %d\n", su);
+ su = XDoesSaveUnders(s);
+ printf("Save unders of screen returns %d\n", su);
+ su = XPlanesOfScreen(s);
+ printf("Planes of screen returns %d\n", su);
+*/
+ xswa.background_pixel = xp->background;
+ xswa.border_pixel = xp->foreground;
+ xswa.colormap = cmap;
+ xswa.override_redirect = True;
+ xswa.backing_store = xp->backing_store;
+ xswa.save_under = xp->save_under;
+ w = XCreateWindow(xp->d, DefaultRootWindow(xp->d), x, y, width, height, 1,
+ xp->vinfo.depth, CopyFromParent, xp->vinfo.visual,
+ CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect
+ | CWBackingStore | CWSaveUnder, &xswa);
+ XMapWindow (xp->d, w);
+ return w;
+}
+
+
+void CreateClipWindows(xp, clips)
+ XParms xp;
+ int clips;
+{
+ int j;
+ XWindowAttributes xwa;
+
+ (void) XGetWindowAttributes(xp->d, xp->w, &xwa);
+ if (clips > MAXCLIP) clips = MAXCLIP;
+ for (j = 0; j != clips; j++) {
+ clipWindows[j] = CreatePerfWindow(xp,
+ xwa.x + ws[j].x, xwa.y + ws[j].y, ws[j].width, ws[j].height);
+ }
+} /* CreateClipWindows */
+
+
+void DestroyClipWindows(xp, clips)
+ XParms xp;
+ int clips;
+{
+ int j;
+
+ if (clips > MAXCLIP) clips = MAXCLIP;
+ for (j = 0; j != clips; j++) {
+ XDestroyWindow(xp->d, clipWindows[j]);
+ }
+} /* DestroyClipWindows */
+
+
+double DoTest(xp, test, reps)
+ XParms xp;
+ Test *test;
+ int reps;
+{
+ double time;
+ unsigned int ret_width, ret_height;
+
+ /* Tell screen-saver to restart counting again. See comments below for the
+ XSetScreenSaver call. */
+ XForceScreenSaver(xp->d, ScreenSaverReset);
+ HardwareSync (xp);
+ InitTimes ();
+ (*test->proc) (xp, &test->parms, reps);
+ HardwareSync(xp);
+
+ time = ElapsedTime(syncTime);
+ if (drawToFakeServer)
+ XQueryBestSize(xp->d, TileShape, tileToQuery,
+ 32, 32, &ret_width, &ret_height);
+ (*test->passCleanup) (xp, &test->parms);
+ return time;
+}
+
+
+int CalibrateTest(xp, test, seconds, usecperobj)
+ XParms xp;
+ Test *test;
+ int seconds;
+ double *usecperobj;
+{
+#define goal 2500000.0 /* Try to get up to 2.5 seconds */
+#define enough 2000000.0 /* But settle for 2.0 seconds */
+#define tick 10000.0 /* Assume clock not faster than .01 seconds */
+
+ double usecs;
+ int reps, didreps; /* Reps desired, reps performed */
+ int exponent;
+
+ /* Attempt to get an idea how long each rep lasts by getting enough
+ reps to last more tan enough. Then scale that up to the number of
+ seconds desired.
+
+ If init call to test ever fails, return False and test will be skipped.
+ */
+
+ if (fixedReps != 0) {
+ return fixedReps;
+ }
+ reps = 1;
+ for (;;) {
+ XDestroySubwindows(xp->d, xp->w);
+ XClearWindow(xp->d, xp->w);
+ didreps = (*test->init) (xp, &test->parms, reps);
+ if (didreps == 0) {
+ return 0;
+ }
+ if ( test->clips < clips )
+ test->clips = clips ;
+ /* Create clip windows if requested */
+ CreateClipWindows(xp, test->clips);
+ HardwareSync(xp);
+ InitTimes();
+ (*test->proc) (xp, &test->parms, reps);
+ HardwareSync(xp);
+ usecs = ElapsedTime(syncTime);
+ (*test->passCleanup) (xp, &test->parms);
+ (*test->cleanup) (xp, &test->parms);
+ DestroyClipWindows(xp, test->clips);
+
+ if (didreps != reps) {
+ /* The test can't do the number of reps as we asked for.
+ Give up */
+ *usecperobj =
+ usecs / (double)(didreps * test->parms.objects);
+ return didreps;
+ }
+ /* Did we go long enough? */
+ if (usecs >= enough) break;
+
+ /* Don't let too short a clock make new reps wildly high */
+ if (usecs <= tick)reps = reps*10;
+ else{
+ /* Try to get up to goal seconds. */
+ reps = (int) (goal * (double)reps / usecs) + 1;
+ }
+ }
+
+ *usecperobj = usecs / (double) (reps * test->parms.objects);
+ reps = (int) ((double)seconds * 1000000.0 * (double)reps / usecs) + 1;
+
+ /* Now round reps up to 1 digit accuracy, so we don't get stupid-looking
+ numbers of repetitions. */
+ reps--;
+ exponent = 1;
+ while (reps > 9) {
+ reps /= 10;
+ exponent *= 10;
+ }
+ reps = (reps + 1) * exponent;
+ return reps;
+} /* CalibrateTest */
+
+void CreatePerfGCs(xp, func, pm)
+ XParms xp;
+ int func;
+ unsigned long pm;
+{
+ XGCValues gcvfg, gcvbg, gcvddbg,gcvddfg;
+ unsigned long fg, bg, ddbg;
+
+ fg = xp->foreground;
+ bg = xp->background;
+ ddbg = xp->ddbackground;
+ gcvfg.graphics_exposures = False;
+ gcvbg.graphics_exposures = False;
+ gcvddfg.graphics_exposures = False;
+ gcvddbg.graphics_exposures = False;
+ gcvfg.plane_mask = pm;
+ gcvbg.plane_mask = pm;
+ gcvddfg.plane_mask = pm;
+ gcvddbg.plane_mask = pm;
+ gcvfg.function = func;
+ gcvbg.function = func;
+ gcvddfg.function = func;
+ gcvddbg.function = func;
+
+ if (func == GXxor) {
+ /* Make test look good visually if possible */
+ gcvbg.foreground = gcvfg.foreground = bg ^ fg;
+ gcvbg.background = gcvfg.background = bg;
+ /* Double Dash GCs (This doesn't make a huge amount of sense) */
+ gcvddbg.foreground = gcvddfg.foreground = bg ^ fg;
+ gcvddbg.background = gcvddfg.foreground = bg ^ ddbg;
+ } else {
+ gcvfg.foreground = fg;
+ gcvfg.background = bg;
+ gcvbg.foreground = bg;
+ gcvbg.background = fg;
+ gcvddfg.foreground = fg;
+ gcvddfg.background = ddbg;
+ gcvddbg.foreground = ddbg;
+ gcvddbg.background = fg;
+ }
+ xp->fggc = XCreateGC(xp->d, xp->w,
+ GCForeground | GCBackground | GCGraphicsExposures
+ | GCFunction | GCPlaneMask, &gcvfg);
+ xp->bggc = XCreateGC(xp->d, xp->w,
+ GCForeground | GCBackground | GCGraphicsExposures
+ | GCFunction | GCPlaneMask, &gcvbg);
+ xp->ddfggc = XCreateGC(xp->d, xp->w,
+ GCForeground | GCBackground | GCGraphicsExposures
+ | GCFunction | GCPlaneMask, &gcvddfg);
+ xp->ddbggc = XCreateGC(xp->d, xp->w,
+ GCForeground | GCBackground | GCGraphicsExposures
+ | GCFunction | GCPlaneMask, &gcvddbg);
+}
+
+
+void DestroyPerfGCs(xp)
+ XParms(xp);
+{
+ XFreeGC(xp->d, xp->fggc);
+ XFreeGC(xp->d, xp->bggc);
+ XFreeGC(xp->d, xp->ddfggc);
+ XFreeGC(xp->d, xp->ddbggc);
+}
+
+unsigned long AllocateColor(display, name, pixel)
+ Display *display;
+ char *name;
+ unsigned long pixel;
+{
+ XColor color;
+
+ if (name != NULL) {
+ /* Try to parse color name */
+ if (XParseColor(display, cmap, name, &color)) {
+ if (XAllocColor(display, cmap, &color)) {
+ pixel = color.pixel;
+ } else {
+ (void) fprintf(stderr,
+ "Can't allocate colormap entry for color %s\n", name);
+ }
+ } else {
+ if(*name >= '0' && *name <= '9')
+ pixel = atoi(name);
+ else
+ (void) fprintf(stderr, "Can't parse color name %s\n", name);
+ }
+ }
+ return pixel;
+} /* AllocateColor */
+
+
+void DisplayStatus(d, message, test, try)
+ Display *d;
+ char *message;
+ char *test;
+{
+ char s[500];
+
+ XClearWindow(d, status);
+ sprintf(s, "%d %s %s", try, message, test);
+ /* We should really look at the height, descent of the font, etc. but
+ who cares. This works. */
+ XDrawString(d, status, tgc, 10, 13, s, strlen(s));
+}
+
+
+void ProcessTest(xp, test, func, pm, label)
+ XParms xp;
+ Test *test;
+ int func;
+ unsigned long pm;
+ char *label;
+{
+ double time, totalTime;
+ int reps;
+ int j;
+
+ xp->planemask = pm;
+ CreatePerfGCs(xp, func, pm);
+ DisplayStatus(xp->d, "Calibrating", label, 0);
+ reps = CalibrateTest(xp, test, seconds, &time);
+ if (reps != 0) {
+ srand(1); /* allow reproducible results */
+ XDestroySubwindows(xp->d, xp->w);
+ XClearWindow(xp->d, xp->w);
+ reps = (*test->init) (xp, &test->parms, reps);
+ /*
+ * if using fixedReps then will not have done CalibrateTest so must
+ * check result of init for 0 here
+ */
+ if(reps == 0){
+ DestroyPerfGCs(xp);
+ return;
+ }
+ /* Create clip windows if requested */
+ CreateClipWindows(xp, test->clips);
+
+ totalTime = 0.0;
+ for (j = 0; j != repeat; j++) {
+ DisplayStatus(xp->d, "Testing", label, j+1);
+ time = DoTest(xp, test, reps);
+ totalTime += time;
+ ReportTimes (time, reps * test->parms.objects,
+ label, False);
+ }
+ if (repeat > 1) {
+ ReportTimes(totalTime,
+ repeat * reps * test->parms.objects,
+ label, True);
+ }
+ (*test->cleanup) (xp, &test->parms);
+ DestroyClipWindows(xp, test->clips);
+ } else {
+ /* Test failed to initialize properly */
+ }
+ printf ("\n");
+ fflush(stdout);
+ DestroyPerfGCs(xp);
+} /* ProcessTest */
+
+#ifndef X_NOT_STDC_ENV
+#define Strstr strstr
+#else
+char *Strstr(s1, s2)
+ char *s1, *s2;
+{
+ int n1, n2;
+
+ n1 = strlen(s1);
+ n2 = strlen(s2);
+ for ( ; n1 >= n2; s1++, n1--) {
+ if (!strncmp(s1, s2, n2))
+ return s1;
+ }
+ return NULL;
+}
+#endif
+
+#define LABELP(i) (test[i].label14 && (xparms.version >= VERSION1_4) \
+ ? test[i].label14 : test[i].label)
+
+main(argc, argv)
+ int argc;
+ char **argv;
+
+{
+ int i, j, n, skip;
+ int numTests; /* Even though the linker knows, we don't. */
+ char hostname[100];
+ char *displayName;
+ Bool foundOne = False;
+ Bool synchronous = False;
+ XGCValues tgcv;
+ int screen;
+ int rop, pm;
+ XVisualInfo *vinfolist, vinfotempl;
+ unsigned long vmask;
+
+ /* Save away argv, argc, for usage to print out */
+ saveargc = argc;
+ saveargv = (char **) malloc(argc * sizeof(char *));
+ for (i = 0; i != argc; i++) {
+ saveargv[i] = argv[i];
+ }
+
+ xparms.pack = False;
+ xparms.save_under = False;
+ xparms.backing_store = NotUseful;
+
+ /* Count number of tests */
+ ForEachTest(numTests);
+ doit = (Bool *)calloc(numTests, sizeof(Bool));
+
+ /* Parse arguments */
+ program_name = argv[0];
+ displayName = Get_Display_Name (&argc, argv);
+ xparms.version = GetVersion(&argc, argv);
+ for (i = 1; i != argc; i++) {
+ if (strcmp (argv[i], "-all") == 0) {
+ ForEachTest (j)
+ doit[j] = test[j].versions & xparms.version;
+ foundOne = True;
+ } else if (strcmp (argv[i], "-labels") == 0) {
+ labels = True;
+ } else if (strcmp(argv[i], "-range") == 0) {
+ char *cp1;
+ char *cp2;
+
+ if (argc <= ++i)
+ usage();
+ cp1 = argv[i];
+ if (*cp1 == '-')
+ cp1++;
+ for (cp2 = cp1; *cp2 != '\0' && *cp2 != ','; cp2++) {};
+ if (*cp2 == ',') {
+ *cp2++ = '\0';
+ if (*cp2 == '-')
+ cp2++;
+ } else {
+ cp2 = "-";
+ }
+ ForEachTest (j) {
+ if (strcmp (cp1, (test[j].option) + 1) == 0 &&
+ (test[j].versions & xparms.version)) {
+ int k = j;
+ do {
+ doit[k] = test[j].versions & xparms.version;
+ } while (!(strcmp(cp2, (test[k].option + 1)) == 0 &&
+ (test[k].versions & xparms.version)) &&
+ test[++k].option != NULL);
+ if (*cp2 != '-' && test[k].option == NULL)
+ usage();
+ break;
+ }
+ }
+ if (test[j].option == NULL)
+ usage();
+ foundOne = True;
+ } else if (strcmp (argv[i], "-sync") == 0) {
+ synchronous = True;
+ } else if (strcmp(argv[i], "-pack") == 0) {
+ xparms.pack = True;
+ } else if (strcmp (argv[i], "-draw") == 0) {
+ drawToFakeServer = True;
+ } else if (strcmp (argv[i], "-repeat") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ repeat = atoi (argv[i]);
+ if (repeat <= 0)
+ usage ();
+ } else if (strcmp (argv[i], "-time") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ seconds = atoi (argv[i]);
+ if (seconds <= 0)
+ usage ();
+ } else if (strcmp(argv[i], "-fg") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ foreground = argv[i];
+ } else if (strcmp(argv[i], "-bg") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ background = argv[i];
+ if(ddbackground == NULL)
+ ddbackground = argv[i];
+ } else if (strcmp(argv[i], "-clips") == 0 ) {
+ i++;
+ if (argc <= i)
+ usage ();
+ clips = atoi( argv[i] );
+ } else if (strcmp(argv[i], "-ddbg") == 0) {
+ if (argc <= i)
+ usage ();
+ i++;
+ ddbackground = argv[i];
+ } else if (strcmp(argv[i], "-rop") == 0) {
+ skip = GetRops (i+1, argc, argv, rops, &numRops);
+ i += skip;
+ } else if (strcmp(argv[i], "-pm") == 0) {
+ skip = GetNumbers (i+1, argc, argv, planemasks, &numPlanemasks);
+ i += skip;
+ } else if (strcmp(argv[i], "-xor") == 0) {
+ numRops = 1;
+ rops[0] = GXxor;
+ } else if (strcmp (argv[i], "-both") == 0) {
+ numRops = 2;
+ rops[0] = GXcopy;
+ rops[1] = GXxor;
+ } else if (strcmp(argv[i], "-reps") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ fixedReps = atoi (argv[i]);
+ if (fixedReps <= 0)
+ usage ();
+ } else if (strcmp(argv[i], "-depth") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ depth = atoi(argv[i]);
+ if (depth <= 0)
+ usage ();
+ } else if (strcmp(argv[i], "-vclass") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ for (j = StaticGray; j <= DirectColor; j++) {
+ if (strcmp(argv[i], visualClassNames[j]) == 0) {
+ vclass = j;
+ break;
+ }
+ }
+ if (vclass < 0)
+ usage ();
+ } else if (strcmp(argv[i], "-subs") == 0) {
+ skip = GetNumbers (i+1, argc, argv, subWindows, &numSubWindows);
+ i += skip;
+ } else if (strcmp(argv[i], "-v1.2") == 0) {
+ xparms.version = VERSION1_2;
+ } else if (strcmp(argv[i], "-v1.3") == 0) {
+ xparms.version = VERSION1_3;
+ } else if (strcmp(argv[i], "-su") == 0) {
+ xparms.save_under = True;
+ } else if (strcmp(argv[i], "-bs") == 0) {
+ i++;
+ if (argc <= i)
+ usage ();
+ if (strcmp(argv[i], "WhenMapped") == 0) {
+ xparms.backing_store = WhenMapped;
+ } else if (strcmp(argv[i], "Always") == 0) {
+ xparms.backing_store = Always;
+ } else usage ();
+ } else {
+ int len,found;
+ ForEachTest (j) {
+ if (strcmp (argv[i], test[j].option) == 0 &&
+ (test[j].versions & xparms.version)) {
+ doit[j] = True;
+ goto LegalOption;
+ }
+ }
+ found = False;
+ len = strlen(argv[i]);
+ if(len>=3)
+ ForEachTest (j) {
+ if (Strstr (test[j].option, argv[i]+1) != 0) {
+ fprintf(stderr," -> %s %s\n", test[j].option, LABELP(j));
+ doit[j] = found = True;
+ }
+ }
+ if(!found)
+ ForEachTest (j) {
+ if (Strstr (LABELP(j), argv[i]+1) != 0) {
+ fprintf(stderr," -> %s %s\n", test[j].option, LABELP(j));
+ doit[j] = found = True;
+ }
+ }
+ if(!found)
+ usage ();
+ LegalOption:
+ foundOne = True;
+ }
+ }
+
+ if (labels) {
+ /* Just print out list of tests for use with .sh programs that
+ assemble data from different x11perf runs into a nice format */
+ ForEachTest (i) {
+ int child;
+ if (doit[i]) {
+ switch (test[i].testType) {
+ case NONROP:
+ printf ("%s\n", LABELP(i));
+ break;
+
+ case ROP:
+ /* Run it through all specified rops and planemasks */
+ for (rop = 0; rop < numRops; rop++) {
+ for (pm = 0; pm < numPlanemasks; pm++) {
+ if (planemasks[pm] == ~0) {
+ if (rops[rop] == GXcopy) {
+ printf ("%s\n", LABELP(i));
+ } else {
+ printf ("(%s) %s\n",
+ ropNames[rops[rop]].name,
+ LABELP(i));
+ }
+ } else {
+ printf ("(%s 0x%x) %s\n",
+ ropNames[rops[rop]].name,
+ planemasks[pm],
+ LABELP(i));
+ }
+ } /* for pm */
+ } /* for rop */
+ break;
+
+ case PLANEMASK:
+ /* Run it through all specified planemasks */
+ for (pm = 0; pm < numPlanemasks; pm++) {
+ if (planemasks[pm] == ~0) {
+ printf ("%s\n", LABELP(i));
+ } else {
+ printf ("(0x%x) %s\n",
+ planemasks[pm],
+ LABELP(i));
+ }
+ } /* for pm */
+ break;
+
+ case WINDOW:
+ for (child = 0; child != numSubWindows; child++) {
+ printf ("%s (%d kids)\n",
+ LABELP(i), subWindows[child]);
+ }
+ break;
+ } /* switch */
+ }
+ }
+ exit(0);
+ }
+
+ if (!foundOne)
+ usage ();
+ xparms.d = Open_Display (displayName);
+ screen = DefaultScreen(xparms.d);
+
+ /* get visual info of default visual */
+ vmask = VisualIDMask | VisualScreenMask;
+ vinfotempl.visualid = XVisualIDFromVisual(XDefaultVisual(xparms.d, screen));
+ vinfotempl.screen = screen;
+ vinfolist = XGetVisualInfo(xparms.d, vmask, &vinfotempl, &n);
+ if (!vinfolist || n != 1) {
+ fprintf (stderr, "%s: can't get visual info of default visual\n",
+ program_name);
+ exit(1);
+ }
+
+ if (depth == -1 && vclass == -1) {
+ /* use the default visual and colormap */
+ xparms.vinfo = *vinfolist;
+ cmap = XDefaultColormap(xparms.d, screen);
+ } else {
+ /* find the specified visual */
+ int errorDepth = vinfolist[0].depth;
+ int errorClass = vinfolist[0].class;
+
+ vmask = VisualScreenMask;
+ vinfotempl.screen = screen;
+ if (depth >= 0) {
+ vinfotempl.depth = depth;
+ vmask |= VisualDepthMask;
+ errorDepth = depth;
+ }
+ if (vclass >= 0) {
+ vinfotempl.class = vclass;
+ vmask |= VisualClassMask;
+ errorClass = vclass;
+ }
+ vinfolist = XGetVisualInfo(xparms.d, vmask, &vinfotempl, &n);
+ if (!vinfolist) {
+ fprintf (stderr,
+ "%s: can't find a visual of depth %d and class %s\n",
+ program_name, errorDepth, visualClassNames[errorClass]);
+ exit(1);
+ }
+ xparms.vinfo = *vinfolist; /* use the first one in list */
+ if (xparms.vinfo.visualid ==
+ XVisualIDFromVisual(XDefaultVisual(xparms.d, screen))) {
+ /* matched visual is same as default visual */
+ cmap = XDefaultColormap(xparms.d, screen);
+ } else {
+ cmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d),
+ xparms.vinfo.visual, AllocNone);
+ /* since this is not default cmap, must force color allocation */
+ if (!foreground) foreground = "Black";
+ if (!background) background = "White";
+ XInstallColormap(xparms.d, cmap);
+ }
+ }
+
+ printf("x11perf - X11 performance program, version %s\n",
+ xparms.version & VERSION1_5 ? "1.5" :
+ xparms.version & VERSION1_4 ? "1.4" :
+ xparms.version & VERSION1_3 ? "1.3" :
+ "1.2"
+ );
+ XmuGetHostname(hostname, 100);
+ printf ("%s server version %d on %s\nfrom %s\n",
+ ServerVendor (xparms.d), VendorRelease (xparms.d),
+ DisplayString (xparms.d), hostname);
+ PrintTime ();
+
+ /* Force screen out of screen-saver mode, grab current data, and set
+ time to blank to 8 hours. We should just be able to turn the screen-
+ saver off, but this causes problems on some servers. We also reset
+ the screen-saver timer each test, as 8 hours is about the maximum time
+ we can use, and that isn't long enough for some X terminals using a
+ serial protocol to finish all the tests. As long as the tests run to
+ completion, the old screen-saver values are restored. */
+ XForceScreenSaver(xparms.d, ScreenSaverReset);
+ XGetScreenSaver(xparms.d, &ssTimeout, &ssInterval, &ssPreferBlanking,
+ &ssAllowExposures);
+ (void) signal(SIGINT, Cleanup); /* ^C */
+#ifdef SIGQUIT
+ (void) signal(SIGQUIT, Cleanup);
+#endif
+ (void) signal(SIGTERM, Cleanup);
+#ifdef SIGHUP
+ (void) signal(SIGHUP, Cleanup);
+#endif
+ XSetScreenSaver(xparms.d, 8 * 3600, ssInterval, ssPreferBlanking,
+ ssAllowExposures);
+
+ if (drawToFakeServer) {
+ tileToQuery =
+ XCreatePixmap(xparms.d, DefaultRootWindow (xparms.d), 32, 32, 1);
+ }
+
+
+ xparms.foreground =
+ AllocateColor(xparms.d, foreground, BlackPixel(xparms.d, screen));
+ xparms.background =
+ AllocateColor(xparms.d, background, WhitePixel(xparms.d, screen));
+ xparms.ddbackground =
+ AllocateColor(xparms.d, ddbackground, WhitePixel(xparms.d, screen));
+ xparms.w = CreatePerfWindow(&xparms, 2, 2, WIDTH, HEIGHT);
+ HSx = WIDTH-1;
+ if (3 + WIDTH > DisplayWidth(xparms.d, screen))
+ HSx = DisplayWidth(xparms.d, screen) - 4;
+ HSy = HEIGHT-1;
+ if (3 + HEIGHT > DisplayHeight(xparms.d, screen))
+ HSy = DisplayHeight(xparms.d, screen) - 4;
+ status = CreatePerfWindow(&xparms, 2, HEIGHT+5, WIDTH, 20);
+ tgcv.foreground =
+ AllocateColor(xparms.d, "black", BlackPixel(xparms.d, screen));
+ tgcv.background =
+ AllocateColor(xparms.d, "white", WhitePixel(xparms.d, screen));
+ tgc = XCreateGC(xparms.d, status, GCForeground | GCBackground, &tgcv);
+
+ xparms.p = (Pixmap)0;
+
+ if (synchronous)
+ XSynchronize (xparms.d, True);
+
+ /* Get mouse pointer out of the way of the performance window. On
+ software cursor machines it will slow graphics performance. On
+ all current MIT-derived servers it will slow window
+ creation/configuration performance. */
+ XWarpPointer(xparms.d, None, status, 0, 0, 0, 0, WIDTH+10, 20+10);
+
+ /* Figure out how long to call HardwareSync, so we can adjust for that
+ in our total elapsed time */
+ (void) CalibrateTest(&xparms, &syncTest, 1, &syncTime);
+ printf("Sync time adjustment is %6.4f msecs.\n\n", syncTime/1000);
+
+ ForEachTest (i) {
+ int child;
+ char label[200];
+
+ if (doit[i] && (test[i].versions & xparms.version)) {
+ switch (test[i].testType) {
+ case NONROP:
+ /* Simplest...just run it once */
+ strcpy (label, LABELP(i));
+ ProcessTest(&xparms, &test[i], GXcopy, ~0L, label);
+ break;
+
+ case ROP:
+ /* Run it through all specified rops and planemasks */
+ for (rop = 0; rop < numRops; rop++) {
+ for (pm = 0; pm < numPlanemasks; pm++) {
+ if (planemasks[pm] == ~0) {
+ if (rops[rop] == GXcopy) {
+ sprintf (label, "%s", LABELP(i));
+ } else {
+ sprintf (label, "(%s) %s",
+ ropNames[rops[rop]].name,
+ LABELP(i));
+ }
+ } else {
+ sprintf (label, "(%s 0x%x) %s",
+ ropNames[rops[rop]].name,
+ planemasks[pm],
+ LABELP(i));
+ }
+ ProcessTest(&xparms, &test[i], rops[rop],
+ planemasks[pm], label);
+ } /* for pm */
+ } /* for rop */
+ break;
+
+ case PLANEMASK:
+ /* Run it through all specified planemasks */
+ for (pm = 0; pm < numPlanemasks; pm++) {
+ if (planemasks[pm] == ~0) {
+ sprintf (label, "%s", LABELP(i));
+ } else {
+ sprintf (label, "(0x%x) %s",
+ planemasks[pm],
+ LABELP(i));
+ }
+ ProcessTest(&xparms, &test[i], GXcopy,
+ planemasks[pm], label);
+ } /* for pm */
+ break;
+
+ case WINDOW:
+ /* Loop through number of children array */
+ for (child = 0; child != numSubWindows; child++) {
+ test[i].parms.objects = subWindows[child];
+ sprintf(label, "%s (%d kids)",
+ LABELP(i), test[i].parms.objects);
+ ProcessTest(&xparms, &test[i], GXcopy, ~0L, label);
+ }
+ break;
+ } /* switch */
+ } /* if doit */
+ } /* ForEachTest */
+
+ XFreeGC(xparms.d, tgc);
+ XDestroyWindow(xparms.d, xparms.w);
+ XFree(vinfolist);
+ if (drawToFakeServer)
+ XFreePixmap(xparms.d, tileToQuery);
+ /* Restore ScreenSaver to original state. */
+ XSetScreenSaver(xparms.d, ssTimeout, ssInterval, ssPreferBlanking,
+ ssAllowExposures);
+ XCloseDisplay(xparms.d);
+ free(saveargv);
+ free(doit);
+}
+
+int
+GetWords (argi, argc, argv, wordsp, nump)
+ int argi;
+ int argc;
+ char **argv;
+ char **wordsp;
+ int *nump;
+{
+ int count;
+
+ if (argc <= argi)
+ usage();
+ count = 0;
+ while (argv[argi] && *(argv[argi]) != '-') {
+ *wordsp++ = argv[argi];
+ ++argi;
+ count++;
+ }
+ *nump = count;
+ return count;
+}
+
+static long
+atox (s)
+ char *s;
+{
+ long v, c;
+
+ v = 0;
+ while (*s) {
+ if ('0' <= *s && *s <= '9')
+ c = *s - '0';
+ else if ('a' <= *s && *s <= 'f')
+ c = *s - 'a' + 10;
+ else if ('A' <= *s && *s <= 'F')
+ c = *s - 'A' + 10;
+ v = v * 16 + c;
+ s++;
+ }
+ return v;
+}
+
+int GetNumbers (argi, argc, argv, intsp, nump)
+ int argi;
+ int argc;
+ char **argv;
+ unsigned long *intsp;
+ int *nump;
+{
+ char *words[256];
+ int count;
+ int i;
+ int flip;
+
+ count = GetWords (argi, argc, argv, words, nump);
+ for (i = 0; i < count; i++) {
+ flip = 0;
+ if (!strncmp (words[i], "~", 1)) {
+ words[i]++;
+ flip = ~0;
+ }
+ if (!strncmp (words[i], "0x", 2))
+ intsp[i] = atox(words[i] + 2) ^ flip;
+ else
+ intsp[i] = atoi (words[i]) ^ flip;
+ }
+ return count;
+}
+
+GetRops (argi, argc, argv, ropsp, nump)
+ int argi;
+ int argc;
+ char **argv;
+ int *ropsp;
+ int *nump;
+{
+ char *words[256];
+ int count;
+ int i;
+ int rop;
+
+ count = GetWords (argi, argc, argv, words, nump);
+ for (i = 0; i < count; i++) {
+ if (!strncmp (words[i], "GX", 2))
+ words[i] += 2;
+ if (!strcmp (words[i], "all")) {
+ for (i = 0; i < 16; i++)
+ ropsp[i] = ropNames[i].rop;
+ *nump = 16;
+ break;
+ }
+ for (rop = 0; rop < 16; rop++) {
+ if (!strcmp (words[i], ropNames[rop].name)) {
+ ropsp[i] = ropNames[rop].rop;
+ break;
+ }
+ }
+ if (rop == 16) {
+ usage ();
+ fprintf (stderr, "unknown rop name %s\n", words[i]);
+ }
+ }
+ return count;
+}
diff --git a/x11perf.h b/x11perf.h
new file mode 100644
index 0000000..b2a415c
--- /dev/null
+++ b/x11perf.h
@@ -0,0 +1,173 @@
+/* $Xorg: x11perf.h,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.
+
+******************************************************************************/
+
+#ifndef VMS
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#else
+#include <decw$include/Xlib.h>
+#include <decw$include/Xutil.h>
+#endif
+#if defined(XlibSpecificationRelease) && XlibSpecificationRelease >= 5
+#include <X11/Xfuncs.h>
+#endif
+#ifndef NULL
+#define NULL 0
+#endif
+
+#define POLY 1000 /* # (small) items in poly calls */
+#define MAXROWS 40 /* Max rows of items in poly calls */
+#define MAXCOLS 25 /* Max columns of items */
+
+#define WIDTH 600 /* Size of large window to work within */
+#define HEIGHT 600
+
+#define CHILDSIZE 8 /* Size of children on windowing tests */
+#define CHILDSPACE 4 /* Space between children */
+
+#define BigTile ((char *)2) /* Big tile/stipple */
+#define OddTile ((char *)1) /* Odd sized tile/stipple */
+
+typedef Bool (*InitProc) (/* XParms xp; Parms p */);
+typedef void (*Proc) (/* XParms xp; Parms p */);
+
+extern void NullProc (/* XParms xp; Parms p */);
+extern Bool NullInitProc (/* XParms xp; Parms p */);
+
+typedef unsigned char Version;
+
+#define VERSION1_2 ((Version)(1 << 0))
+#define VERSION1_3 ((Version)(1 << 1))
+#define VERSION1_4 ((Version)(1 << 2))
+#define VERSION1_5 ((Version)(1 << 3))
+#define V1_2ONLY VERSION1_2
+#define V1_2FEATURE (VERSION1_2 | VERSION1_3 | VERSION1_4 | VERSION1_5)
+#define V1_3FEATURE (VERSION1_3 | VERSION1_4 | VERSION1_5)
+#define V1_4FEATURE (VERSION1_4 | VERSION1_5)
+#define V1_5FEATURE (VERSION1_5)
+
+typedef struct _Parms {
+ /* Required fields */
+ int objects; /* Number of objects to process in one X call */
+
+ /* Optional fields. (Wouldn't object-oriented programming be nice ?) */
+ int special; /* Usually size of objects to paint */
+ char *font, *bfont;
+ int fillStyle; /* Solid, transparent stipple, opaque stipple, tile */
+} ParmRec, *Parms;
+
+typedef struct _XParms {
+ Display *d;
+ Window w;
+ Pixmap p;
+ GC fggc;
+ GC bggc;
+ GC ddfggc;
+ GC ddbggc;
+ unsigned long foreground;
+ unsigned long background;
+ unsigned long ddbackground;
+ XVisualInfo vinfo;
+ Bool pack;
+ Version version;
+ Bool save_under;
+ int backing_store;
+ unsigned long planemask;
+} XParmRec, *XParms;
+
+typedef enum {
+ WINDOW, /* Windowing test, rop, planemask have no affect */
+ ROP, /* Graphics test, rop, planemask has some affect */
+ PLANEMASK, /* Graphics test, rop no affect, planemask some affect */
+ NONROP /* Graphics or overhead test, rop has no affect */
+} TestType;
+
+typedef struct _Test {
+ char *option; /* Name to use in prompt line */
+ char *label; /* Fuller description of test */
+ char *label14; /* Labels that are different in Version 1.4 */
+ InitProc init; /* Initialization procedure */
+ Proc proc; /* Timed benchmark procedure */
+ Proc passCleanup;/* Cleanup between repetitions of same test */
+ Proc cleanup; /* Cleanup after test */
+ Version versions; /* Test in 1.2 only, 1.3 only, or both */
+ TestType testType; /* Windowing, graphics rop, graphics non-rop */
+ int clips; /* Number of obscuring windows to force clipping*/
+ ParmRec parms; /* Parameters passed to test procedures */
+} Test;
+
+extern Test test[];
+
+#define ForEachTest(x) for (x = 0; test[x].option != NULL; x++)
+
+
+/*****************************************************************************
+
+About x11perf:
+
+Many graphics benchmarks assume that the graphics device is used to display the
+output of a single fancy graphics application, and that the user gets his work
+done on some other device, like a terminal. Such benchmarks usually measure
+drawing speed for lines, polygons, text, etc.
+
+Since workstations are not used as standalone graphics engines, but as
+super-terminals, x11perf measures window management performance as well as
+traditional graphics performace. x11perf includes benchmarks for the time it
+takes to create and map windows (as when you start up an application); to map a
+pre-existing set of windows onto the screen (as when you deiconify an
+application or pop up a menu); and to rearrange windows (as when you slosh
+windows to and fro trying to find the one you want).
+
+x11perf also measures graphics performance for operations not normally used in
+standalone graphics displays, but are nonetheless used frequently by X
+applications. Such operations include CopyPlane (used by the PostScript
+previewer), scrolling (used in text windows), and various stipples and tiles
+(used for CAD and half-toning, respectively).
+
+x11perf DOES NOT attempt to whittle down measurements to a single ``HeXStones''
+number. We consider such numbers to be uninformative at best and misleading at
+worst. x11perf should be used to analyze particular strengths and weaknesses
+of servers, and is most useful when used by a server writer who wants to
+analyze and improve a server.
+
+For repeatable results, x11perf should be run using a local connection on a
+freshly-started server. The default configuration runs each test 5 times, in
+order to see if each trial takes approximately the same amount of time.
+Strange glitches should be examined; if non-repeatable I chalk them up to
+daemons and network traffic. Each trial is run for 5 seconds, in order to
+reduce random time differences. The number of objects processed per second is
+displayed to 3 significant digits, but you'll be lucky on most UNIX system if
+the numbers are actually consistent to 2 digits.
+
+The current program is mostly the responsibility of Joel McCormack. It is
+based upon the x11perf developed by Phil Karlton, Susan Angebranndt, and Chris
+Kent, who wanted to assess performance differences between various servers.
+Mary Walker, Todd Newman, and I added several tests in order to write and tune
+the pmax (DECStation 3100) servers. For a general release to the world, I've
+basically rewritten x11perf to ease making comparisons between widely varying
+machines, to cover most important X functionality (the notable exception being
+wide lines), and to exercise graphics operations in as many different
+orientations and alignments as possible.
+
+******************************************************************************/
diff --git a/x11perf.man b/x11perf.man
new file mode 100644
index 0000000..bfb4c58
--- /dev/null
+++ b/x11perf.man
@@ -0,0 +1,1015 @@
+.\" $Xorg: x11perf.man,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
+.\" Copyright 1988, 1989 Digital Equipment Corporation.
+.\" Copyright 1989, 1994, 1998 The Open Group
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software and its
+.\" documentation for any purpose is hereby granted without fee, provided that
+.\" the above copyright notice appear in all copies and that both that
+.\" copyright notice and this permission notice appear in supporting
+.\" documentation.
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of The Open Group shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from The Open Group.
+.TH X11PERF 1 "Release 6.4" "X Version 11"
+.SH NAME
+x11perf \- X11 server performance test program
+.SH SYNTAX
+.B x11perf
+[ \-option ... ]
+.SH DESCRIPTION
+The
+.I x11perf
+program runs one or more performance tests and reports how fast an X server can
+execute the tests.
+.PP
+Many graphics benchmarks assume that the graphics device is used to display the
+output of a single fancy graphics application, and that the user gets his work
+done on some other device, like a terminal. Such benchmarks usually measure
+drawing speed for lines, polygons, text, etc.
+.PP
+Since workstations are not used as standalone graphics engines, but as
+super-terminals,
+.I x11perf
+measures window management performance as well as
+traditional graphics performace.
+.I x11perf
+includes benchmarks for the time it
+takes to create and map windows (as when you start up an application); to map a
+pre-existing set of windows onto the screen (as when you deiconify an
+application or pop up a menu); and to rearrange windows (as when you slosh
+windows to and fro trying to find the one you want).
+.PP
+.I x11perf
+also measures graphics performance for operations not normally used in
+standalone graphics displays, but are nonetheless used frequently by X
+applications. Such operations include CopyPlane (used to map bitmaps into
+pixels), scrolling (used in text windows), and various stipples and tiles
+(used for CAD and color half-toning, respectively).
+.PP
+.I x11perf
+should be used to analyze particular strengths and weaknesses
+of servers, and is most useful to a server writer who wants to
+analyze and improve a server.
+.I x11perf
+is meant to comprehensively exercise just about every X11 operation you can
+perform; it does not purport to be a representative sample of the
+operations that X11 applications actually use.
+While it can be used as a benchmark, it was written and is intended as
+a performance testing tool.
+.PP
+As such,
+.I x11perf
+DOES NOT whittle down measurements to a single ``HeXStones''
+or ``MeXops'' number. We consider such numbers to be uninformative
+at best and misleading at worst.
+Some servers which are very fast for certain applications can be
+very slow for others.
+No single number or small set of numbers are sufficient to
+characterize how an X implementation will perform on all applications.
+However, by knowledge of your favorite application, you
+may be able to use the numbers
+.I x11perf
+reports to predict its performance on a given X implementation.
+.PP
+That said, you might also want to look at
+.I x11perfcomp(1),
+a program to compare the outputs of different
+.I x11perf
+runs. You provide a list of files containing results from
+.I x11perf,
+and it lays them out in a nice tabular format.
+.PP
+For repeatable results,
+.I x11perf
+should be run using a local connection on a
+freshly-started server. The default configuration runs each test 5 times, in
+order to see if each trial takes approximately the same amount of time.
+Strange glitches should be examined; if non-repeatable one might
+chalk them up to
+daemons and network traffic. Each trial is run for 5 seconds, in order to
+reduce random time differences. The number of objects processed per second is
+displayed to 3 significant digits, but you'll be lucky on most UNIX system if
+the numbers are actually consistent to 2 digits.
+.I x11perf
+moves the cursor out of the test window; you should be careful not
+to bump the mouse and move it back into the window.
+(A prize to people who correctly explain why!!).
+.PP
+Before running a test,
+.I x11perf
+determines what the round trip time to the server is, and factors this out of
+the final timing reported. It ensures that the server has actually performed
+the work requested by fetching a pixel back from the test window, which means
+that servers talking to graphics accelerators can't claim that they are done,
+while in the meantime the accelerator is painting madly.
+.PP
+By default
+.I x11perf
+automatically calibrates the number of repetitions of each test,
+so that each should take approximately the same length of time to run across
+servers of widely differing speeds. However, since each test must be run to
+completion at least once, some slow servers may take a very long time,
+particularly on the window moving and resizing tests, and on the arc drawing
+tests.
+.PP
+All timing reports are for the smallest object involved. For example, the line
+tests use a PolyLine request to paint several lines at once, but report how
+many lines per second the server can paint, not how many PolyLine requests per
+second. Text tests paint a line of characters, but report on the number of
+characters per second. Some window tests map, unmap, or move a single parent
+window, but report on how many children windows per second the server can map,
+unmap, or move.
+.PP
+The current program is mostly the responsibility of Joel McCormack. It is
+based upon the x11perf developed by Phil Karlton, Susan Angebranndt, Chris
+Kent, Mary Walker, and Todd Newman, who wanted to assess performance differences between various servers.
+Several tests were added in order to write and tune
+the PMAX (DECStation 3100) servers.
+For a general release to the world,
+.I x11perf
+was rewritten to ease making comparisons between widely varying
+machines, to cover most important (and unimportant) X functionality,
+and to exercise graphics operations in as many different
+orientations and alignments as possible.
+.SH OPTIONS
+.I x11perf
+is solely Xlib based, and
+accepts the options listed below:
+.TP 14
+.B \-display host:dpy
+Specifies which display to use.
+.TP 14
+.B \-sync
+Runs the tests in synchronous mode.
+Normally only useful for debugging
+.I x11perf .
+.TP 14
+.B \-pack
+Runs rectangle tests so that they pack rectangles right next to each other.
+This makes it easy to debug server code for stipples and tiles...if the
+pattern looks ugly, you've got alignment problems.
+.TP 14
+.B \-repeat \fI<n>\fP
+Repeats each test
+.I n
+times (by default each test is run 5 times).
+.TP 14
+.B \-time \fI<s>\fP
+Specifies how long in seconds each test should be run (default 5 seconds).
+.TP 14
+.B \-all
+Runs all tests. This may take a while.
+.TP 14
+.B \-range \fI<test1>\fP[,\fI<test2>\fP]
+Runs all the tests starting from the specified name \fItest1\fP until
+the name \fItest2\fP, including both the specified tests. The testnames
+should be one of the options starting from -dot. (eg) -range line100
+will peform the tests from the 100 pixel line test, and go on till the
+last test, -range line100,dline10 will do the tests from line100 to
+dline10.
+.TP 14
+.B \-labels
+Generates just the descriptive labels for each test specified. See
+.I x11perfcomp
+for more details.
+.TP 14
+.B \-fg \fIcolor-or-pixel\fP
+Specifies the foreground color or pixel value to use.
+.TP 14
+.B \-bg \fIcolor-or-pixel\fP
+Specifies the background color or pixel value to use.
+.TP 14
+.B \-clips \fIdefault\fP
+Default number of clip windows.
+.TP 14
+.B \-ddbg \fIcolor-or-pixel\fP
+Specifies the color or pixel value to use for drawing
+the odd segments of a DoubleDashed line or arc.
+This will default to the bg color.
+.TP 14
+.B \-rop <rop0 rop1 ...>
+Use specified raster ops (default is GXcopy).
+This option only affects graphics
+benchmarks in which the graphics function is actually used.
+.TP 14
+.B \-pm <pm0 pm1 ...>
+Use specified planemasks (default is ~0).
+This option only affects graphics
+benchmarks in which the planemask is actually used.
+.TP 14
+.B \-depth <depth>
+Use a visual with <depth> planes per pixel (default is the default
+visual).
+.TP 14
+.B \-vclass <vclass>
+Use a visual with of class <vclass>. <vclass> can be StaticGray, GrayScale,
+StaticColor, PseudoColor, TrueColor, or DirectColor. (default is the default
+visual).
+.TP 14
+.B \-reps <n>
+Specify the repetion count (Default is number that takes aprox. 5 seconds)
+.TP 14
+.B \-subs <s0 s1 ...>
+Specify the number of sub windows to use in the Window tests.
+Default is 4, 16, 25, 50, 75, 100 and 200.
+.TP 14
+.B \-v1.2
+Perform only x11perf Version 1.2 tests using Version 1.2 semantics.
+.TP 14
+.B \-v1.3
+Perform only x11perf Version 1.3 tests using Version 1.3 semantics.
+.TP 14
+.B \-su
+Set the save_under window attribute to True on all windows created by x11perf.
+Default is False.
+.TP 14
+.B \-bs <backing_store_hint>
+Set the backing_store window attribute to the given value on all windows
+created by x11perf. <backing_store_hint> can be WhenMapped or
+Always. Default is NotUseful.
+.TP 14
+.B \-dot
+Dot.
+.TP 14
+.B \-rect1
+1x1 solid-filled rectangle.
+.TP 14
+.B \-rect10
+10x10 solid-filled rectangle.
+.TP 14
+.B \-rect100
+100x100 solid-filled rectangle.
+.TP 14
+.B \-rect500
+500x500 solid-filled rectangle.
+.TP 14
+.B \-srect1
+1x1 transparent stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-srect10
+10x10 transparent stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-srect100
+100x100 transparent stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-srect500
+500x500 transparent stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-osrect1
+1x1 opaque stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-osrect10
+10x10 opaque stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-osrect100
+100x100 opaque stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-osrect500
+500x500 opaque stippled rectangle, 8x8 stipple pattern.
+.TP 14
+.B \-tilerect1
+1x1 tiled rectangle, 4x4 tile pattern.
+.TP 14
+.B \-tilerect10
+10x10 tiled rectangle, 4x4 tile pattern.
+.TP 14
+.B \-tilerect100
+100x100 tiled rectangle, 4x4 tile pattern.
+.TP 14
+.B \-tilerect500
+500x500 tiled rectangle, 4x4 tile pattern.
+.TP 14
+.B \-oddsrect1
+1x1 transparent stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddsrect10
+10x10 transparent stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddsrect100
+100x100 transparent stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddsrect500
+500x500 transparent stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddosrect1
+1x1 opaque stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddosrect10
+10x10 opaque stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddosrect100
+100x100 opaque stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddosrect500
+500x500 opaque stippled rectangle, 17x15 stipple pattern.
+.TP 14
+.B \-oddtilerect1
+1x1 tiled rectangle, 17x15 tile pattern.
+.TP 14
+.B \-oddtilerect10
+10x10 tiled rectangle, 17x15 tile pattern.
+.TP 14
+.B \-oddtilerect100
+100x100 tiled rectangle, 17x15 tile pattern.
+.TP 14
+.B \-oddtilerect500
+500x500 tiled rectangle, 17x15 tile pattern.
+.TP 14
+.B \-bigsrect1
+1x1 stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigsrect10
+10x10 stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigsrect100
+100x100 stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigsrect500
+500x500 stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigosrect1
+1x1 opaque stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigosrect10
+10x10 opaque stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigosrect100
+100x100 opaque stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigosrect500
+500x500 opaque stippled rectangle, 161x145 stipple pattern.
+.TP 14
+.B \-bigtilerect1
+1x1 tiled rectangle, 161x145 tile pattern.
+.TP 14
+.B \-bigtilerect10
+10x10 tiled rectangle, 161x145 tile pattern.
+.TP 14
+.B \-bigtilerect100
+100x100 tiled rectangle, 161x145 tile pattern.
+.TP 14
+.B \-bigtilerect500
+500x500 tiled rectangle, 161x145 tile pattern.
+.TP 14
+.B \-eschertilerect1
+1x1 tiled rectangle, 215x208 tile pattern.
+.TP 14
+.B \-eschertilerect10
+10x10 tiled rectangle, 215x208 tile pattern.
+.TP 14
+.B \-eschertilerect100
+100x100 tiled rectangle, 215x208 tile pattern.
+.TP 14
+.B \-eschertilerect500
+500x500 tiled rectangle, 215x208 tile pattern.
+.TP 14
+.B \-seg1
+1-pixel thin line segment.
+.TP 14
+.B \-seg10
+10-pixel thin line segment.
+.TP 14
+.B \-seg100
+100-pixel thin line segment.
+.TP 14
+.B \-seg500
+500-pixel thin line segment.
+.TP 14
+.B \-seg100c1
+100-pixel thin line segment (1 obscuring rectangle).
+.TP 14
+.B \-seg100c2
+100-pixel thin line segment (2 obscuring rectangles).
+.TP 14
+.B \-seg100c3
+100-pixel thin line segment (3 obscuring rectangles).
+.TP 14
+.B \-dseg10
+10-pixel thin dashed segment (3 on, 2 off).
+.TP 14
+.B \-dseg100
+100-pixel thin dashed segment (3 on, 2 off).
+.TP 14
+.B \-ddseg100
+100-pixel thin double-dashed segment (3 fg, 2 bg).
+.TP 14
+.B \-hseg10
+10-pixel thin horizontal line segment.
+.TP 14
+.B \-hseg100
+100-pixel thin horizontal line segment.
+.TP 14
+.B \-hseg500
+500-pixel thin horizontal line segment.
+.TP 14
+.B \-vseg10
+10-pixel thin vertical line segment.
+.TP 14
+.B \-vseg100
+100-pixel thin vertical line segment.
+.TP 14
+.B \-vseg500
+500-pixel thin vertical line segment.
+.TP 14
+.B \-whseg10
+10-pixel wide horizontal line segment.
+.TP 14
+.B \-whseg100
+100-pixel wide horizontal line segment.
+.TP 14
+.B \-whseg500
+500-pixel wide horizontal line segment.
+.TP 14
+.B \-wvseg10
+10-pixel wide vertical line segment.
+.TP 14
+.B \-wvseg100
+100-pixel wide vertical line segment.
+.TP 14
+.B \-wvseg500
+500-pixel wide vertical line segment.
+.TP 14
+.B \-line1
+1-pixel thin (width 0) line.
+.TP 14
+.B \-line10
+10-pixel thin line.
+.TP 14
+.B \-line100
+100-pixel thin line.
+.TP 14
+.B \-line500
+500-pixel thin line.
+.TP 14
+.B \-dline10
+10-pixel thin dashed line (3 on, 2 off).
+.TP 14
+.B \-dline100
+100-pixel thin dashed line (3 on, 2 off).
+.TP 14
+.B \-ddline100
+100-pixel thin double-dashed line (3 fg, 2 bg).
+.TP 14
+.B \-wline10
+10-pixel line, line width 1.
+.TP 14
+.B \-wline100
+100-pixel line, line width 10.
+.TP 14
+.B \-wline500
+500-pixel line, line width 50.
+.TP 14
+.B \-wdline100
+100-pixel dashed line, line width 10 (30 on, 20 off).
+.TP 14
+.B \-wddline100
+100-pixel double-dashed line, line width 10 (30 fg, 20 bg).
+.TP 14
+.B \-orect10
+10x10 thin rectangle outline.
+.TP 14
+.B \-orect100
+100-pixel thin vertical line segment.
+.TP 14
+.B \-orect500
+500-pixel thin vertical line segment.
+.TP 14
+.B \-worect10
+10x10 wide rectangle outline.
+.TP 14
+.B \-worect100
+100-pixel wide vertical line segment.
+.TP 14
+.B \-worect500
+500-pixel wide vertical line segment.
+.TP 14
+.B \-circle1
+1-pixel diameter thin (line width 0) circle.
+.TP 14
+.B \-circle10
+10-pixel diameter thin circle.
+.TP 14
+.B \-circle100
+100-pixel diameter thin circle.
+.TP 14
+.B \-circle500
+500-pixel diameter thin circle.
+.TP 14
+.B \-dcircle100
+100-pixel diameter thin dashed circle (3 on, 2 off).
+.TP 14
+.B \-ddcircle100
+100-pixel diameter thin double-dashed circle (3 fg, 2 bg).
+.TP 14
+.B \-wcircle10
+10-pixel diameter circle, line width 1.
+.TP 14
+.B \-wcircle100
+100-pixel diameter circle, line width 10.
+.TP 14
+.B \-wcircle500
+500-pixel diameter circle, line width 50.
+.TP 14
+.B \-wdcircle100
+100-pixel diameter dashed circle, line width 10 (30 on, 20 off).
+.TP 14
+.B \-wddcircle100
+100-pixel diameter double-dashed circle, line width 10 (30 fg, 20 bg).
+.TP 14
+.B \-pcircle10
+10-pixel diameter thin partial circle,
+orientation and arc angle evenly distributed.
+.TP 14
+.B \-pcircle100
+100-pixel diameter thin partial circle.
+.TP 14
+.B \-wpcircle10
+10-pixel diameter wide partial circle.
+.TP 14
+.B \-wpcircle100
+100-pixel diameter wide partial circle.
+.TP 14
+.B \-fcircle1
+1-pixel diameter filled circle.
+.TP 14
+.B \-fcircle10
+10-pixel diameter filled circle.
+.TP 14
+.B \-fcircle100
+100-pixel diameter filled circle.
+.TP 14
+.B \-fcircle500
+500-pixel diameter filled circle.
+.TP 14
+.B \-fcpcircle10
+10-pixel diameter partial filled circle, chord fill,
+orientation and arc angle evenly distributed.
+.TP 14
+.B \-fcpcircle100
+100-pixel diameter partial filled circle, chord fill.
+.TP 14
+.B \-fspcircle10
+10-pixel diameter partial filled circle, pie slice fill,
+orientation and arc angle evenly distributed.
+.TP 14
+.B \-fspcircle100
+100-pixel diameter partial filled circle, pie slice fill.
+.TP 14
+.B \-ellipse10
+10-pixel diameter thin (line width 0) ellipse, major and
+minor axis sizes evenly distributed.
+.TP 14
+.B \-ellipse100
+100-pixel diameter thin ellipse.
+.TP 14
+.B \-ellipse500
+500-pixel diameter thin ellipse.
+.TP 14
+.B \-dellipse100
+100-pixel diameter thin dashed ellipse (3 on, 2 off).
+.TP 14
+.B \-ddellipse100
+100-pixel diameter thin double-dashed ellipse (3 fg, 2 bg).
+.TP 14
+.B \-wellipse10
+10-pixel diameter ellipse, line width 1.
+.TP 14
+.B \-wellipse100
+100-pixel diameter ellipse, line width 10.
+.TP 14
+.B \-wellipse500
+500-pixel diameter ellipse, line width 50.
+.TP 14
+.B \-wdellipse100
+100-pixel diameter dashed ellipse, line width 10 (30 on, 20 off).
+.TP 14
+.B \-wddellipse100
+100-pixel diameter double-dashed ellipse, line width 10 (30 fg, 20 bg).
+.TP 14
+.B \-pellipse10
+10-pixel diameter thin partial ellipse.
+.TP 14
+.B \-pellipse100
+100-pixel diameter thin partial ellipse.
+.TP 14
+.B \-wpellipse10
+10-pixel diameter wide partial ellipse.
+.TP 14
+.B \-wpellipse100
+100-pixel diameter wide partial ellipse.
+.TP 14
+.B \-fellipse10
+10-pixel diameter filled ellipse.
+.TP 14
+.B \-fellipse100
+100-pixel diameter filled ellipse.
+.TP 14
+.B \-fellipse500
+500-pixel diameter filled ellipse.
+.TP 14
+.B \-fcpellipse10
+10-pixel diameter partial filled ellipse, chord fill.
+.TP 14
+.B \-fcpellipse100
+100-pixel diameter partial filled ellipse, chord fill.
+.TP 14
+.B \-fspellipse10
+10-pixel diameter partial filled ellipse, pie slice fill.
+.TP 14
+.B \-fspellipse100
+100-pixel diameter partial filled ellipse, pie slice fill.
+.TP 14
+.B \-triangle1
+Fill 1-pixel/side triangle.
+.TP 14
+.B \-triangle10
+Fill 10-pixel/side triangle.
+.TP 14
+.B \-triangle100
+Fill 100-pixel/side triangle.
+.TP 14
+.B \-trap1
+Fill 1x1 trapezoid.
+.TP 14
+.B \-trap10
+Fill 10x10 trapezoid.
+.TP 14
+.B \-trap100
+Fill 100x100 trapezoid.
+.TP 14
+.B \-trap300
+Fill 300x300 trapezoid.
+.TP 14
+.B \-strap1
+Fill 1x1 transparent stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-strap10
+Fill 10x10 transparent stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-strap100
+Fill 100x100 transparent stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-strap300
+Fill 300x300 transparent stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-ostrap1
+Fill 10x10 opaque stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-ostrap10
+Fill 10x10 opaque stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-ostrap100
+Fill 100x100 opaque stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-ostrap300
+Fill 300x300 opaque stippled trapezoid, 8x8 stipple pattern.
+.TP 14
+.B \-tiletrap1
+Fill 10x10 tiled trapezoid, 4x4 tile pattern.
+.TP 14
+.B \-tiletrap10
+Fill 10x10 tiled trapezoid, 4x4 tile pattern.
+.TP 14
+.B \-tiletrap100
+Fill 100x100 tiled trapezoid, 4x4 tile pattern.
+.TP 14
+.B \-tiletrap300
+Fill 300x300 tiled trapezoid, 4x4 tile pattern.
+.TP 14
+.B \-oddstrap1
+Fill 1x1 transparent stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddstrap10
+Fill 10x10 transparent stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddstrap100
+Fill 100x100 transparent stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddstrap300
+Fill 300x300 transparent stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddostrap1
+Fill 10x10 opaque stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddostrap10
+Fill 10x10 opaque stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddostrap100
+Fill 100x100 opaque stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddostrap300
+Fill 300x300 opaque stippled trapezoid, 17x15 stipple pattern.
+.TP 14
+.B \-oddtiletrap1
+Fill 10x10 tiled trapezoid, 17x15 tile pattern.
+.TP 14
+.B \-oddtiletrap10
+Fill 10x10 tiled trapezoid, 17x15 tile pattern.
+.TP 14
+.B \-oddtiletrap100
+Fill 100x100 tiled trapezoid, 17x15 tile pattern.
+.TP 14
+.B \-oddtiletrap300
+Fill 300x300 tiled trapezoid, 17x15 tile pattern.
+.TP 14
+.B \-bigstrap1
+Fill 1x1 transparent stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigstrap10
+Fill 10x10 transparent stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigstrap100
+Fill 100x100 transparent stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigstrap300
+Fill 300x300 transparent stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigostrap1
+Fill 10x10 opaque stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigostrap10
+Fill 10x10 opaque stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigostrap100
+Fill 100x100 opaque stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigostrap300
+Fill 300x300 opaque stippled trapezoid, 161x145 stipple pattern.
+.TP 14
+.B \-bigtiletrap1
+Fill 10x10 tiled trapezoid, 161x145 tile pattern.
+.TP 14
+.B \-bigtiletrap10
+Fill 10x10 tiled trapezoid, 161x145 tile pattern.
+.TP 14
+.B \-bigtiletrap100
+Fill 100x100 tiled trapezoid, 161x145 tile pattern.
+.TP 14
+.B \-bigtiletrap300
+Fill 300x300 tiled trapezoid, 161x145 tile pattern.
+.TP 14
+.B \-eschertiletrap1
+Fill 1x1 tiled trapezoid, 216x208 tile pattern.
+.TP 14
+.B \-eschertiletrap10
+Fill 10x10 tiled trapezoid, 216x208 tile pattern.
+.TP 14
+.B \-eschertiletrap100
+Fill 100x100 tiled trapezoid, 216x208 tile pattern.
+.TP 14
+.B \-eschertiletrap300
+Fill 300x300 tiled trapezoid, 216x208 tile pattern.
+.TP 14
+.B \-complex10
+Fill 10-pixel/side complex polygon.
+.TP 14
+.B \-complex100
+Fill 100-pixel/side complex polygon.
+.TP 14
+.B \-64poly10convex
+Fill 10x10 convex 64-gon.
+.TP 14
+.B \-64poly100convex
+Fill 100x100 convex 64-gon.
+.TP 14
+.B \-64poly10complex
+Fill 10x10 complex 64-gon.
+.TP 14
+.B \-64poly100complex
+Fill 100x100 complex 64-gon.
+.TP 14
+.B \-ftext
+Character in 80-char line (6x13).
+.TP 14
+.B \-f8text
+Character in 70-char line (8x13).
+.TP 14
+.B \-f9text
+Character in 60-char line (9x15).
+.TP 14
+.B \-f14text16
+2-byte character in 40-char line (k14).
+.TP 14
+.B \-tr10text
+Character in 80-char line (Times-Roman 10).
+.TP 14
+.B \-tr24text
+Character in 30-char line (Times-Roman 24).
+.TP 14
+.B \-polytext
+Character in 20/40/20 line (6x13, Times-Roman 10, 6x13).
+.TP 14
+.B \-polytext16
+2-byte character in 7/14/7 line (k14, k24).
+.TP 14
+.B \-fitext
+Character in 80-char image line (6x13).
+.TP 14
+.B \-f8itext
+Character in 70-char image line (8x13).
+.TP 14
+.B \-f9itext
+Character in 60-char image line (9x15).
+.TP 14
+.B \-f14itext16
+2-byte character in 40-char image line (k14).
+.TP 14
+.B \-f24itext16
+2-byte character in 23-char image line (k24).
+.TP 14
+.B \-tr10itext
+Character in 80-char image line (Times-Roman 10).
+.TP 14
+.B \-tr24itext
+Character in 30-char image line (Times-Roman 24).
+.TP 14
+.B \-scroll10
+Scroll 10x10 pixels vertically.
+.TP 14
+.B \-scroll100
+Scroll 100x100 pixels vertically.
+.TP 14
+.B \-scroll500
+Scroll 500x500 pixels vertically.
+.TP 14
+.B \-copywinwin10
+Copy 10x10 square from window to window.
+.TP 14
+.B \-copywinwin100
+Copy 100x100 square from window to window.
+.TP 14
+.B \-copywinwin500
+Copy 500x500 square from window to window.
+.TP 14
+.B \-copypixwin10
+Copy 10x10 square from pixmap to window.
+.TP 14
+.B \-copypixwin100
+Copy 100x100 square from pixmap to window.
+.TP 14
+.B \-copypixwin500
+Copy 500x500 square from pixmap to window.
+.TP 14
+.B \-copywinpix10
+Copy 10x10 square from window to pixmap.
+.TP 14
+.B \-copywinpix100
+Copy 100x100 square from window to pixmap.
+.TP 14
+.B \-copywinpix500
+Copy 500x500 square from window to pixmap.
+.TP 14
+.B \-copypixpix10
+Copy 10x10 square from pixmap to pixmap.
+.TP 14
+.B \-copypixpix100
+Copy 100x100 square from pixmap to pixmap.
+.TP 14
+.B \-copypixpix500
+Copy 500x500 square from pixmap to pixmap.
+.TP 14
+.B \-copyplane10
+Copy 10x10 1-bit deep plane.
+.TP 14
+.B \-copyplane100
+Copy 100x100 1-bit deep plane.
+.TP 14
+.B \-copyplane500
+Copy 500x500 1-bit deep plane.
+.TP 14
+.B \-putimage10
+PutImage 10x10 square.
+.TP 14
+.B \-putimage100
+PutImage 100x100 square.
+.TP 14
+.B \-putimage500
+PutImage 500x500 square.
+.TP 14
+.B \-putimagexy10
+PutImage XY format 10x10 square.
+.TP 14
+.B \-putimagexy100
+PutImage XY format 100x100 square.
+.TP 14
+.B \-putimagexy500
+PutImage XY format 500x500 square.
+.TP 14
+.B \-shmput10
+PutImage 10x10 square, MIT shared memory extension.
+.TP 14
+.B \-shmput100
+PutImage 100x100 square, MIT shared memory extension.
+.TP 14
+.B \-shmput500
+PutImage 500x500 square, MIT shared memory extension.
+.TP 14
+.B \-shmputxy10
+PutImage XY format 10x10 square, MIT shared memory extension.
+.TP 14
+.B \-shmputxy100
+PutImage XY format 100x100 square, MIT shared memory extension.
+.TP 14
+.B \-shmputxy500
+PutImage XY format 500x500 square, MIT shared memory extension.
+.TP 14
+.B \-getimage10
+GetImage 10x10 square.
+.TP 14
+.B \-getimage100
+GetImage 100x100 square.
+.TP 14
+.B \-getimage500
+GetImage 500x500 square.
+.TP 14
+.B \-getimagexy10
+GetImage XY format 10x10 square.
+.TP 14
+.B \-getimagexy100
+GetImage XY format 100x100 square.
+.TP 14
+.B \-getimagexy500
+GetImage XY format 500x500 square.
+.TP 14
+.B \-noop
+X protocol NoOperation.
+.TP 14
+.B \-atom
+GetAtomName.
+.TP 14
+.B \-pointer
+QueryPointer.
+.TP 14
+.B \-prop
+GetProperty.
+.TP 14
+.B \-gc
+Change graphics context.
+.TP 14
+.B \-create
+Create child window and map using MapSubwindows.
+.TP 14
+.B \-ucreate
+Create unmapped window.
+.TP 14
+.B \-map
+Map child window via MapWindow on parent.
+.TP 14
+.B \-unmap
+Unmap child window via UnmapWindow on parent.
+.TP 14
+.B \-destroy
+Destroy child window via DestroyWindow parent.
+.TP 14
+.B \-popup
+Hide/expose window via Map/Unmap popup window.
+.TP 14
+.B \-move
+Move window.
+.TP 14
+.B \-umove
+Moved unmapped window.
+.TP 14
+.B \-movetree
+Move window via MoveWindow on parent.
+.TP 14
+.B \-resize
+Resize window.
+.TP 14
+.B \-uresize
+Resize unmapped window.
+.TP 14
+.B \-circulate
+Circulate lowest window to top.
+.TP 14
+.B \-ucirculate
+Circulate unmapped window to top.
+.SH X DEFAULTS
+There are no X defaults used by this program.
+.SH "SEE ALSO"
+X(1), xbench(1), x11perfcomp(1)
+.SH AUTHORS
+Joel McCormack
+.br
+Phil Karlton
+.br
+Susan Angebranndt
+.br
+Chris Kent
+.br
+Keith Packard
+.br
+Graeme Gill
diff --git a/x11perfcomp.man b/x11perfcomp.man
new file mode 100644
index 0000000..b6a4f6a
--- /dev/null
+++ b/x11perfcomp.man
@@ -0,0 +1,79 @@
+.\" $Xorg: x11pcomp.man,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
+.\" Copyright 1993, 1994, 1998 The Open Group
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software and its
+.\" documentation for any purpose is hereby granted without fee, provided that
+.\" the above copyright notice appear in all copies and that both that
+.\" copyright notice and this permission notice appear in supporting
+.\" documentation.
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of The Open Group shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from The Open Group.
+.TH X11PERFCOMP 1 "Release 6.4" "X Version 11"
+.SH NAME
+x11perfcomp \- X11 server performance comparison program
+.SH SYNTAX
+.B x11perfcomp
+[ \-r | \-ro ] [ \-l label_file ] files
+.SH DESCRIPTION
+The
+.I x11perfcomp
+program merges the output of several
+.I x11perf(1)
+runs into a nice tabular
+format. It takes the results in each file, fills in any missing test results if
+necessary, and for each test shows the objects/second rate of each server.
+If invoked with the -r or -ro options, it shows the relative performance
+of each server to the first server.
+.PP
+Normally,
+.I x11perfcomp
+uses the first file specified to determine which specific tests it should
+report on. Some (non-DEC :) servers may fail to perform
+all tests. In this case,
+.I x11perfcomp
+automatically substitutes in a rate of 0.0 objects/second.
+Since the first file
+determines which tests to report on, this file must contain a superset of
+the tests reported in the other files, else
+.I x11perfcomp
+will fail.
+.PP
+You can provide an explicit list of tests to report on
+by using the -l switch to specify a file of labels. You can create a label
+file by using the -label option in
+.I x11perf.
+.SH OPTIONS
+.I x11perfcomp
+accepts the options listed below:
+.TP 16
+.B \-r
+Specifies that the output should also include relative server
+performance.
+.TP 16
+.B \-ro
+Specifies that the output should include only relative server performance.
+.TP 16
+.B \-l label_file
+Specifies a label file to use.
+.SH X DEFAULTS
+There are no X defaults used by this program.
+.SH "SEE ALSO"
+X(1), x11perf(1)
+.SH AUTHORS
+Mark Moraes wrote the original scripts to compare servers.
+.br
+Joel McCormack just munged them together a bit.