tests.c revision fd7d9bd3
1fd7d9bd3Smrg/*
2fd7d9bd3Smrg** $XConsortium: tests.c,v 1.20 91/06/08 18:57:07 rws Exp $
3fd7d9bd3Smrg** $XFree86: xc/programs/xgc/tests.c,v 1.11tsi Exp $
4fd7d9bd3Smrg**
5fd7d9bd3Smrg*/
6fd7d9bd3Smrg
7fd7d9bd3Smrg#include <X11/Intrinsic.h>
8fd7d9bd3Smrg#include <X11/StringDefs.h>
9fd7d9bd3Smrg#include <X11/Xaw/AsciiText.h>
10fd7d9bd3Smrg#include <X11/Xos.h>
11fd7d9bd3Smrg#include <stdio.h>
12fd7d9bd3Smrg#include <stdlib.h>
13fd7d9bd3Smrg#include <math.h>
14fd7d9bd3Smrg#include "xgc.h"
15fd7d9bd3Smrg#ifdef SVR4
16fd7d9bd3Smrg#define SYSV
17fd7d9bd3Smrg#endif
18fd7d9bd3Smrg#if !defined(SYSV) && !defined(QNX4)
19fd7d9bd3Smrg#include <sys/timeb.h>
20fd7d9bd3Smrg#include <sys/resource.h>
21fd7d9bd3Smrg#endif
22fd7d9bd3Smrg
23fd7d9bd3Smrg#ifndef PI
24fd7d9bd3Smrg#define PI 3.14159265
25fd7d9bd3Smrg#endif
26fd7d9bd3Smrg
27fd7d9bd3Smrg#ifdef SYSV
28fd7d9bd3Smrg#define random lrand48
29fd7d9bd3Smrg#endif
30fd7d9bd3Smrg
31fd7d9bd3Smrg
32fd7d9bd3Smrg/* timer(flag)
33fd7d9bd3Smrg** -----------
34fd7d9bd3Smrg** When called with StartTimer, starts the stopwatch and returns nothing.
35fd7d9bd3Smrg** When called with EndTimer, stops the stopwatch and returns the time
36fd7d9bd3Smrg** in microseconds since it started.
37fd7d9bd3Smrg**
38fd7d9bd3Smrg** Uses rusage() so we can subtract the time used by the system and user
39fd7d9bd3Smrg** from our timer, and just concentrate on the time used in the X calls.
40fd7d9bd3Smrg*/
41fd7d9bd3Smrg
42fd7d9bd3Smrgstatic long
43fd7d9bd3Smrgtimer(int flag)
44fd7d9bd3Smrg{
45fd7d9bd3Smrg#if !defined(SYSV)
46fd7d9bd3Smrg  static struct timeval starttime;  /* starting time for gettimeofday() */
47fd7d9bd3Smrg  struct timeval endtime;           /* ending time for gettimeofday() */
48fd7d9bd3Smrg#if !defined(__UNIXOS2__) && !defined(QNX4)
49fd7d9bd3Smrg  static struct rusage startusage;  /* starting time for getrusage() */
50fd7d9bd3Smrg  struct rusage endusage;           /* ending time for getrusage() */
51fd7d9bd3Smrg#endif
52fd7d9bd3Smrg  struct timezone tz;               /* to make gettimeofday() happy */
53fd7d9bd3Smrg
54fd7d9bd3Smrg  long elapsedtime;                 /* how long since we started the timer */
55fd7d9bd3Smrg
56fd7d9bd3Smrg  switch (flag) {
57fd7d9bd3Smrg    case StartTimer:                       /* store initial values */
58fd7d9bd3Smrg      gettimeofday(&starttime,&tz);
59fd7d9bd3Smrg#if !defined(__UNIXOS2__) && !defined(QNX4)
60fd7d9bd3Smrg      getrusage(RUSAGE_SELF,&startusage);
61fd7d9bd3Smrg#endif
62fd7d9bd3Smrg      return((long) NULL);
63fd7d9bd3Smrg    case EndTimer:
64fd7d9bd3Smrg      gettimeofday(&endtime,&tz);          /* store final values */
65fd7d9bd3Smrg#if !defined(__UNIXOS2__) && !defined(QNX4)
66fd7d9bd3Smrg      getrusage(RUSAGE_SELF,&endusage);
67fd7d9bd3Smrg#endif
68fd7d9bd3Smrg
69fd7d9bd3Smrg  /* all the following line does is use the formula
70fd7d9bd3Smrg     elapsed time = ending time - starting time, but there are three
71fd7d9bd3Smrg     different timers and two different units of time, ack... */
72fd7d9bd3Smrg
73fd7d9bd3Smrg#if !defined(__UNIXOS2__) && !defined(QNX4)
74fd7d9bd3Smrg      elapsedtime = (long) ((long)
75fd7d9bd3Smrg	((endtime.tv_sec - endusage.ru_utime.tv_sec - endusage.ru_stime.tv_sec
76fd7d9bd3Smrg	 - starttime.tv_sec + startusage.ru_utime.tv_sec
77fd7d9bd3Smrg	 + startusage.ru_stime.tv_sec)) * 1000000) + (long)
78fd7d9bd3Smrg      ((endtime.tv_usec - endusage.ru_utime.tv_usec - endusage.ru_stime.tv_usec
79fd7d9bd3Smrg	 - starttime.tv_usec + startusage.ru_utime.tv_usec
80fd7d9bd3Smrg	 + startusage.ru_stime.tv_usec));
81fd7d9bd3Smrg#else
82fd7d9bd3Smrg      elapsedtime = (long)( ((long)endtime.tv_sec-(long)starttime.tv_sec)*1000000
83fd7d9bd3Smrg			   +((long)endtime.tv_usec-(long)starttime.tv_usec));
84fd7d9bd3Smrg#endif
85fd7d9bd3Smrg      return(elapsedtime);
86fd7d9bd3Smrg
87fd7d9bd3Smrg    default:
88fd7d9bd3Smrg      fprintf(stderr,"Invalid flag in timer()\n");
89fd7d9bd3Smrg      return((long) NULL);
90fd7d9bd3Smrg    }
91fd7d9bd3Smrg#else
92fd7d9bd3Smrg  static time_t starttime;
93fd7d9bd3Smrg
94fd7d9bd3Smrg  switch (flag) {
95fd7d9bd3Smrg    case StartTimer:
96fd7d9bd3Smrg      time(&starttime);
97fd7d9bd3Smrg      return((long) NULL);
98fd7d9bd3Smrg    case EndTimer:
99fd7d9bd3Smrg      return( (time(NULL) - starttime) * 1000000);
100fd7d9bd3Smrg    default:
101fd7d9bd3Smrg      fprintf(stderr,"Invalid flag in timer()\n");
102fd7d9bd3Smrg      return((long) NULL);
103fd7d9bd3Smrg    }
104fd7d9bd3Smrg#endif
105fd7d9bd3Smrg}
106fd7d9bd3Smrg
107fd7d9bd3Smrg
108fd7d9bd3Smrgvoid
109fd7d9bd3Smrgcopyarea_test(void)
110fd7d9bd3Smrg{
111fd7d9bd3Smrg  int num_copies = 200;
112fd7d9bd3Smrg  int i;
113fd7d9bd3Smrg  long totaltime;
114fd7d9bd3Smrg  char buf[80];
115fd7d9bd3Smrg
116fd7d9bd3Smrg  num_copies *= X.percent;
117fd7d9bd3Smrg
118fd7d9bd3Smrg  XSetFillStyle(X.dpy,X.miscgc,FillTiled);
119fd7d9bd3Smrg  XFillRectangle(X.dpy,X.win,X.miscgc,0,0,400,400);
120fd7d9bd3Smrg
121fd7d9bd3Smrg  XSync(X.dpy,0);
122fd7d9bd3Smrg  timer(StartTimer);
123fd7d9bd3Smrg  for (i=0;i<num_copies;++i)
124fd7d9bd3Smrg    XCopyArea(X.dpy,X.win,X.win,X.gc,i,200-i,
125fd7d9bd3Smrg	      200,200,200-i,i);
126fd7d9bd3Smrg  XSync(X.dpy,0);
127fd7d9bd3Smrg  totaltime = timer(EndTimer);
128fd7d9bd3Smrg
129fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%.2f seconds.",(double)totaltime/1000000.);
130fd7d9bd3Smrg  show_result(buf);
131fd7d9bd3Smrg}
132fd7d9bd3Smrg
133fd7d9bd3Smrgvoid
134fd7d9bd3Smrgcopyplane_test(void)
135fd7d9bd3Smrg{
136fd7d9bd3Smrg  int num_copies = 200;
137fd7d9bd3Smrg  int i;
138fd7d9bd3Smrg  long totaltime;
139fd7d9bd3Smrg  char buf[80];
140fd7d9bd3Smrg
141fd7d9bd3Smrg  if(!X.gcv.plane_mask || (X.gcv.plane_mask & (X.gcv.plane_mask - 1))) {
142fd7d9bd3Smrg    show_result("exactly one bit in plane mask must be set for this test");
143fd7d9bd3Smrg    return;
144fd7d9bd3Smrg  }
145fd7d9bd3Smrg
146fd7d9bd3Smrg
147fd7d9bd3Smrg  num_copies *= X.percent;
148fd7d9bd3Smrg
149fd7d9bd3Smrg  XSetPlaneMask(X.dpy, X.gc, ~0L);
150fd7d9bd3Smrg  XSetFillStyle(X.dpy,X.miscgc,FillTiled);
151fd7d9bd3Smrg  XFillRectangle(X.dpy,X.win,X.miscgc,0,0,400,400);
152fd7d9bd3Smrg
153fd7d9bd3Smrg  XSync(X.dpy,0);
154fd7d9bd3Smrg  timer(StartTimer);
155fd7d9bd3Smrg  for (i=0;i<num_copies;++i)
156fd7d9bd3Smrg    XCopyPlane(X.dpy,X.win,X.win,X.gc,i,200-i,
157fd7d9bd3Smrg	      200,200,200-i,i,X.gcv.plane_mask);
158fd7d9bd3Smrg  XSync(X.dpy,0);
159fd7d9bd3Smrg  totaltime = timer(EndTimer);
160fd7d9bd3Smrg  XSetPlaneMask(X.dpy, X.gc, X.gcv.plane_mask);
161fd7d9bd3Smrg
162fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%.2f seconds.",(double)totaltime/1000000.);
163fd7d9bd3Smrg  show_result(buf);
164fd7d9bd3Smrg}
165fd7d9bd3Smrg
166fd7d9bd3Smrgvoid
167fd7d9bd3Smrgcircle_line_test(int num_vertices, int radius)
168fd7d9bd3Smrg{
169fd7d9bd3Smrg  double theta, delta;
170fd7d9bd3Smrg  int length, centerx, centery, i;
171fd7d9bd3Smrg  int relative_angle;
172fd7d9bd3Smrg  long totaltime;
173fd7d9bd3Smrg  char buf[80];
174fd7d9bd3Smrg  XPoint *coord;
175fd7d9bd3Smrg
176fd7d9bd3Smrg  relative_angle = num_vertices*5/12+1;
177fd7d9bd3Smrg  delta = (double) relative_angle / (double) num_vertices * 2 * PI;
178fd7d9bd3Smrg  centerx = centery = 200;
179fd7d9bd3Smrg
180fd7d9bd3Smrg  coord = (XPoint *) malloc (sizeof(XPoint)*(num_vertices+1));
181fd7d9bd3Smrg
182fd7d9bd3Smrg  length = (int) (2 * radius * (float) atan(delta/2.));
183fd7d9bd3Smrg
184fd7d9bd3Smrg  for (i=0;i<=num_vertices;++i) {
185fd7d9bd3Smrg    theta = (double) i * delta;
186fd7d9bd3Smrg    coord[i].x = centerx + (int) (radius * cos(theta));
187fd7d9bd3Smrg    coord[i].y = centery + (int) (radius * sin(theta));
188fd7d9bd3Smrg  }
189fd7d9bd3Smrg
190fd7d9bd3Smrg  XSync(X.dpy,0);
191fd7d9bd3Smrg  timer(StartTimer);
192fd7d9bd3Smrg  XDrawLines(X.dpy,X.win,X.gc,coord,num_vertices+1,CoordModeOrigin);
193fd7d9bd3Smrg  XSync(X.dpy,0);
194fd7d9bd3Smrg  totaltime = timer(EndTimer);
195fd7d9bd3Smrg
196fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d lines of length %d in %.3f seconds.",num_vertices,
197fd7d9bd3Smrg	  length,(double)totaltime/1000000.);
198fd7d9bd3Smrg  show_result(buf);
199fd7d9bd3Smrg
200fd7d9bd3Smrg  free(coord);
201fd7d9bd3Smrg}
202fd7d9bd3Smrg
203fd7d9bd3Smrg
204fd7d9bd3Smrg
205fd7d9bd3Smrgvoid
206fd7d9bd3Smrgpolyline_test(void)
207fd7d9bd3Smrg{
208fd7d9bd3Smrg  circle_line_test((int)(601*X.percent),190);
209fd7d9bd3Smrg}
210fd7d9bd3Smrg
211fd7d9bd3Smrgvoid
212fd7d9bd3Smrgpolysegment_test(void)
213fd7d9bd3Smrg{
214fd7d9bd3Smrg  XSegment *segments;
215fd7d9bd3Smrg  int num_segments = 600;
216fd7d9bd3Smrg  long totaltime;
217fd7d9bd3Smrg  char buf[80];
218fd7d9bd3Smrg  int i;
219fd7d9bd3Smrg
220fd7d9bd3Smrg  num_segments *= X.percent;
221fd7d9bd3Smrg
222fd7d9bd3Smrg  segments = (XSegment *) malloc(sizeof(XSegment) * num_segments);
223fd7d9bd3Smrg
224fd7d9bd3Smrg  segments[0].x1 = random()%400; segments[0].y1 = random()%400;
225fd7d9bd3Smrg  segments[0].x2 = random()%400; segments[0].y2 = random()%400;
226fd7d9bd3Smrg
227fd7d9bd3Smrg  for(i=1;i<num_segments;++i) {
228fd7d9bd3Smrg    segments[i].x1 = (segments[i-1].x1-segments[i-1].y2+400+i)%400;
229fd7d9bd3Smrg    segments[i].y1 = (segments[i-1].y1+segments[i-1].x2+i)%400;
230fd7d9bd3Smrg    segments[i].x2 = (segments[i-1].x1-segments[i-1].y1+400+i)%400;
231fd7d9bd3Smrg    segments[i].y2 = (segments[i-1].x2+segments[i-1].y2+i)%400;
232fd7d9bd3Smrg  }
233fd7d9bd3Smrg
234fd7d9bd3Smrg  XSync(X.dpy,0);
235fd7d9bd3Smrg  start_timer();
236fd7d9bd3Smrg  XDrawSegments(X.dpy,X.win,X.gc,segments,num_segments);
237fd7d9bd3Smrg  XSync(X.dpy,0);
238fd7d9bd3Smrg  totaltime = end_timer();
239fd7d9bd3Smrg
240fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d segments in %.3f seconds.",num_segments,
241fd7d9bd3Smrg	  (double)totaltime/1000000.);
242fd7d9bd3Smrg  show_result(buf);
243fd7d9bd3Smrg
244fd7d9bd3Smrg  free(segments);
245fd7d9bd3Smrg}
246fd7d9bd3Smrg
247fd7d9bd3Smrgvoid
248fd7d9bd3Smrgpolypoint_test(void)
249fd7d9bd3Smrg{
250fd7d9bd3Smrg  XPoint *points;
251fd7d9bd3Smrg  int num_points = 100000;
252fd7d9bd3Smrg  long totaltime;
253fd7d9bd3Smrg  char buf[80];
254fd7d9bd3Smrg  int i;
255fd7d9bd3Smrg
256fd7d9bd3Smrg  num_points *= X.percent;
257fd7d9bd3Smrg
258fd7d9bd3Smrg  points = (XPoint *) malloc(sizeof(XPoint) * num_points);
259fd7d9bd3Smrg
260fd7d9bd3Smrg  points[0].x = random()%400; points[0].y = random()%400;
261fd7d9bd3Smrg  points[1].x = random()%400; points[1].y = random()%400;
262fd7d9bd3Smrg
263fd7d9bd3Smrg  for (i=2;i<num_points;++i) {
264fd7d9bd3Smrg    points[i].x = (points[i-1].x+points[i-2].y+i*3/200)%400;
265fd7d9bd3Smrg    points[i].y = (points[i-1].y+points[i-2].x+i*5/200)%400;
266fd7d9bd3Smrg  }
267fd7d9bd3Smrg
268fd7d9bd3Smrg  XSync(X.dpy,0);
269fd7d9bd3Smrg  start_timer();
270fd7d9bd3Smrg  XDrawPoints(X.dpy,X.win,X.gc,points,num_points,CoordModeOrigin);
271fd7d9bd3Smrg  XSync(X.dpy,0);
272fd7d9bd3Smrg  totaltime = end_timer();
273fd7d9bd3Smrg
274fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d points in %.3f seconds.",num_points,
275fd7d9bd3Smrg	  (double)totaltime/1000000.);
276fd7d9bd3Smrg  show_result(buf);
277fd7d9bd3Smrg
278fd7d9bd3Smrg  free(points);
279fd7d9bd3Smrg}
280fd7d9bd3Smrg
281fd7d9bd3Smrgvoid
282fd7d9bd3Smrggenericrectangle_test(Boolean fill)
283fd7d9bd3Smrg{
284fd7d9bd3Smrg  XRectangle *rects;
285fd7d9bd3Smrg  int num_rects = 200;
286fd7d9bd3Smrg  int perimeter = 0, area = 0;
287fd7d9bd3Smrg  int i;
288fd7d9bd3Smrg  long totaltime;
289fd7d9bd3Smrg  char buf[80];
290fd7d9bd3Smrg
291fd7d9bd3Smrg  num_rects *= X.percent;
292fd7d9bd3Smrg
293fd7d9bd3Smrg  rects = (XRectangle *) malloc(sizeof(XRectangle) * num_rects);
294fd7d9bd3Smrg
295fd7d9bd3Smrg  for (i=0;i<num_rects;++i) {
296fd7d9bd3Smrg    rects[i].x = rects[i].y = 200 - i;
297fd7d9bd3Smrg    rects[i].width = rects[i].height = 2 * i;
298fd7d9bd3Smrg    perimeter += rects[i].width * 2 + rects[i].height * 2;
299fd7d9bd3Smrg    area += rects[i].width * rects[i].height;
300fd7d9bd3Smrg  }
301fd7d9bd3Smrg
302fd7d9bd3Smrg  XSync(X.dpy,0);
303fd7d9bd3Smrg  start_timer();
304fd7d9bd3Smrg  if (fill) XFillRectangles(X.dpy,X.win,X.gc,rects,num_rects);
305fd7d9bd3Smrg  else XDrawRectangles(X.dpy,X.win,X.gc,rects,num_rects);
306fd7d9bd3Smrg  XSync(X.dpy,0);
307fd7d9bd3Smrg  totaltime = end_timer();
308fd7d9bd3Smrg
309fd7d9bd3Smrg  if (fill)
310fd7d9bd3Smrg    snprintf(buf,sizeof buf,"%d pixels in %.2f seconds.",area,(double)totaltime/1000000.);
311fd7d9bd3Smrg  else
312fd7d9bd3Smrg    snprintf(buf,sizeof buf,"Total line length %d in %.3f seconds.",perimeter,
313fd7d9bd3Smrg	    (double)totaltime/1000000.);
314fd7d9bd3Smrg  show_result(buf);
315fd7d9bd3Smrg
316fd7d9bd3Smrg  free(rects);
317fd7d9bd3Smrg}
318fd7d9bd3Smrg
319fd7d9bd3Smrgvoid
320fd7d9bd3Smrgpolyrectangle_test(void)
321fd7d9bd3Smrg{
322fd7d9bd3Smrg  genericrectangle_test(FALSE);
323fd7d9bd3Smrg}
324fd7d9bd3Smrg
325fd7d9bd3Smrgvoid
326fd7d9bd3Smrgpolyfillrectangle_test(void)
327fd7d9bd3Smrg{
328fd7d9bd3Smrg  genericrectangle_test(TRUE);
329fd7d9bd3Smrg}
330fd7d9bd3Smrg
331fd7d9bd3Smrg/*****************************/
332fd7d9bd3Smrg
333fd7d9bd3Smrgvoid
334fd7d9bd3Smrgfillpolygon_test(void)
335fd7d9bd3Smrg{
336fd7d9bd3Smrg  int i;
337fd7d9bd3Smrg  int points_per_side = 40;
338fd7d9bd3Smrg  int spacing;
339fd7d9bd3Smrg  XPoint *points;
340fd7d9bd3Smrg  XPoint polypoints[3];
341fd7d9bd3Smrg
342fd7d9bd3Smrg  points = (XPoint *) malloc (sizeof(XPoint) * points_per_side * 4);
343fd7d9bd3Smrg  spacing = 400 / points_per_side;
344fd7d9bd3Smrg
345fd7d9bd3Smrg  for (i = 0; i < points_per_side; ++i) {
346fd7d9bd3Smrg    points[i].x = i * spacing;
347fd7d9bd3Smrg    points[i].y = 0;
348fd7d9bd3Smrg
349fd7d9bd3Smrg    points[i + points_per_side].x = 400;
350fd7d9bd3Smrg    points[i + points_per_side].y = i * spacing;
351fd7d9bd3Smrg
352fd7d9bd3Smrg    points[i + 2 * points_per_side].x = 400 - i * spacing;
353fd7d9bd3Smrg    points[i + 2 * points_per_side].y = 400;
354fd7d9bd3Smrg
355fd7d9bd3Smrg    points[i + 3 * points_per_side].x = 0;
356fd7d9bd3Smrg    points[i + 3 * points_per_side].y = 400 - i * spacing;
357fd7d9bd3Smrg  }
358fd7d9bd3Smrg
359fd7d9bd3Smrg  for (i = 0; i < 2 * points_per_side; i += 2) {
360fd7d9bd3Smrg    polypoints[0].x = points[i].x;
361fd7d9bd3Smrg    polypoints[0].y = points[i].y;
362fd7d9bd3Smrg
363fd7d9bd3Smrg    polypoints[1].x = points[i + 2 * points_per_side].x;
364fd7d9bd3Smrg    polypoints[1].y = points[i + 2 * points_per_side].y;
365fd7d9bd3Smrg
366fd7d9bd3Smrg    polypoints[2].x = points[i + 2 * points_per_side + 1].x;
367fd7d9bd3Smrg    polypoints[2].y = points[i + 2 * points_per_side + 1].y;
368fd7d9bd3Smrg
369fd7d9bd3Smrg    XFillPolygon (X.dpy, X.win, X.gc, polypoints, 3, Convex, CoordModeOrigin);
370fd7d9bd3Smrg  }
371fd7d9bd3Smrg  free(points);
372fd7d9bd3Smrg}
373fd7d9bd3Smrg
374fd7d9bd3Smrg/*****************************/
375fd7d9bd3Smrg
376fd7d9bd3Smrgvoid
377fd7d9bd3Smrggenericarc_test(Boolean fill)
378fd7d9bd3Smrg{
379fd7d9bd3Smrg  XArc *arcs;
380fd7d9bd3Smrg  int num_arcs = 180;
381fd7d9bd3Smrg  int i;
382fd7d9bd3Smrg  long totaltime;
383fd7d9bd3Smrg  char buf[80];
384fd7d9bd3Smrg
385fd7d9bd3Smrg  num_arcs *= X.percent;
386fd7d9bd3Smrg
387fd7d9bd3Smrg  arcs = (XArc *) malloc(sizeof(XArc) * num_arcs);
388fd7d9bd3Smrg
389fd7d9bd3Smrg  for (i=0;i<num_arcs;++i) {
390fd7d9bd3Smrg    arcs[i].x = i;
391fd7d9bd3Smrg    arcs[i].y = i;
392fd7d9bd3Smrg    arcs[i].width = i;
393fd7d9bd3Smrg    arcs[i].height = i;
394fd7d9bd3Smrg    arcs[i].angle1 = i * 128;
395fd7d9bd3Smrg    arcs[i].angle2 = i * 128;
396fd7d9bd3Smrg  }
397fd7d9bd3Smrg
398fd7d9bd3Smrg  XSync(X.dpy,0);
399fd7d9bd3Smrg  start_timer();
400fd7d9bd3Smrg  if (fill) XFillArcs(X.dpy,X.win,X.gc,arcs,num_arcs);
401fd7d9bd3Smrg  else XDrawArcs(X.dpy,X.win,X.gc,arcs,num_arcs);
402fd7d9bd3Smrg  XSync(X.dpy,0);
403fd7d9bd3Smrg  totaltime = end_timer();
404fd7d9bd3Smrg
405fd7d9bd3Smrg  snprintf(buf,sizeof buf,"An uncounted number of pixels in %.3f seconds.",
406fd7d9bd3Smrg	  (double)totaltime/1000000.);
407fd7d9bd3Smrg  show_result(buf);
408fd7d9bd3Smrg
409fd7d9bd3Smrg  free(arcs);
410fd7d9bd3Smrg}
411fd7d9bd3Smrg
412fd7d9bd3Smrgvoid
413fd7d9bd3Smrgpolyarc_test(void)
414fd7d9bd3Smrg{
415fd7d9bd3Smrg  genericarc_test(FALSE);
416fd7d9bd3Smrg}
417fd7d9bd3Smrg
418fd7d9bd3Smrgvoid
419fd7d9bd3Smrgpolyfillarc_test(void)
420fd7d9bd3Smrg{
421fd7d9bd3Smrg  genericarc_test(TRUE);
422fd7d9bd3Smrg}
423fd7d9bd3Smrg
424fd7d9bd3Smrgstatic const char string8[] = "pack my box with five dozen liquor jugs";
425fd7d9bd3Smrg
426fd7d9bd3Smrgvoid
427fd7d9bd3Smrgpolytext8_test(void)
428fd7d9bd3Smrg{
429fd7d9bd3Smrg  int num_strings = 200;
430fd7d9bd3Smrg  int i;
431fd7d9bd3Smrg  long totaltime;
432fd7d9bd3Smrg  char buf[80];
433fd7d9bd3Smrg
434fd7d9bd3Smrg  num_strings *= X.percent;
435fd7d9bd3Smrg
436fd7d9bd3Smrg  XSync(X.dpy,0);
437fd7d9bd3Smrg  start_timer();
438fd7d9bd3Smrg  for (i=0;i<num_strings;++i) {
439fd7d9bd3Smrg    XDrawString(X.dpy,X.win,X.gc,(i%2 ? i : num_strings - i),i,
440fd7d9bd3Smrg		string8,sizeof(string8)-1);
441fd7d9bd3Smrg  }
442fd7d9bd3Smrg  XSync(X.dpy,0);
443fd7d9bd3Smrg  totaltime = end_timer();
444fd7d9bd3Smrg
445fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d strings in %.2f seconds.",num_strings,
446fd7d9bd3Smrg	  (double) totaltime/1000000.);
447fd7d9bd3Smrg  show_result(buf);
448fd7d9bd3Smrg}
449fd7d9bd3Smrg
450fd7d9bd3Smrgvoid
451fd7d9bd3Smrgimagetext8_test(void)
452fd7d9bd3Smrg{
453fd7d9bd3Smrg  int num_strings = 200;
454fd7d9bd3Smrg  int i;
455fd7d9bd3Smrg  long totaltime;
456fd7d9bd3Smrg  char buf[80];
457fd7d9bd3Smrg
458fd7d9bd3Smrg  num_strings *= X.percent;
459fd7d9bd3Smrg
460fd7d9bd3Smrg  XSync(X.dpy,0);
461fd7d9bd3Smrg  start_timer();
462fd7d9bd3Smrg  for (i=0;i<num_strings;++i) {
463fd7d9bd3Smrg    XDrawImageString(X.dpy,X.win,X.gc,(i%2 ? i : num_strings - i),i,
464fd7d9bd3Smrg		     string8,sizeof(string8)-1);
465fd7d9bd3Smrg  }
466fd7d9bd3Smrg  XSync(X.dpy,0);
467fd7d9bd3Smrg  totaltime = end_timer();
468fd7d9bd3Smrg
469fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d strings in %.2f seconds.",num_strings,
470fd7d9bd3Smrg	  (double) totaltime/1000000.);
471fd7d9bd3Smrg  show_result(buf);
472fd7d9bd3Smrg}
473fd7d9bd3Smrg
474fd7d9bd3Smrgstatic char unicode_font[] =
475fd7d9bd3Smrg  "-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1";
476fd7d9bd3Smrg
477fd7d9bd3Smrgstatic const XChar2b string16[] = {
478fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x20 }, { 0x22, 0x2E }, { 0x00, 0x20 },
479fd7d9bd3Smrg  { 0x00, 0x45 }, { 0x22, 0xC5 }, { 0x00, 0x64 }, { 0x00, 0x61 },
480fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x3D }, { 0x00, 0x20 }, { 0x00, 0x51 },
481fd7d9bd3Smrg  { 0x00, 0x2C }, { 0x00, 0x20 }, { 0x00, 0x20 }, { 0x00, 0x6E },
482fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x21, 0x92 }, { 0x00, 0x20 }, { 0x22, 0x1E },
483fd7d9bd3Smrg  { 0x00, 0x2C }, { 0x00, 0x20 }, { 0x22, 0x11 }, { 0x00, 0x20 },
484fd7d9bd3Smrg  { 0x00, 0x66 }, { 0x00, 0x28 }, { 0x00, 0x69 }, { 0x00, 0x29 },
485fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x3D }, { 0x00, 0x20 }, { 0x22, 0x0F },
486fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x67 }, { 0x00, 0x28 }, { 0x00, 0x69 },
487fd7d9bd3Smrg  { 0x00, 0x29 }, { 0x00, 0x2C }, { 0x00, 0x20 }, { 0x22, 0x00 },
488fd7d9bd3Smrg  { 0x00, 0x78 }, { 0x22, 0x08 }, { 0x21, 0x1D }, { 0x00, 0x3A },
489fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x23, 0x08 }, { 0x00, 0x78 }, { 0x23, 0x09 },
490fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x3D }, { 0x00, 0x20 }, { 0x22, 0x12 },
491fd7d9bd3Smrg  { 0x23, 0x0A }, { 0x22, 0x12 }, { 0x00, 0x78 }, { 0x23, 0x0B },
492fd7d9bd3Smrg  { 0x00, 0x2C }, { 0x00, 0x20 }, { 0x03, 0xB1 }, { 0x00, 0x20 },
493fd7d9bd3Smrg  { 0x22, 0x27 }, { 0x00, 0x20 }, { 0x00, 0xAC }, { 0x03, 0xB2 },
494fd7d9bd3Smrg  { 0x00, 0x20 }, { 0x00, 0x3D }, { 0x00, 0x20 }, { 0x00, 0xAC },
495fd7d9bd3Smrg  { 0x00, 0x28 }, { 0x00, 0xAC }, { 0x03, 0xB1 }, { 0x00, 0x20 },
496fd7d9bd3Smrg  { 0x22, 0x28 }, { 0x00, 0x20 }, { 0x03, 0xB2 }, { 0x00, 0x29 },
497fd7d9bd3Smrg  { 0x00, 0x2C }
498fd7d9bd3Smrg};
499fd7d9bd3Smrg
500fd7d9bd3Smrgvoid
501fd7d9bd3Smrgpolytext16_test(void)
502fd7d9bd3Smrg{
503fd7d9bd3Smrg  int num_strings = 50;
504fd7d9bd3Smrg  int i;
505fd7d9bd3Smrg  long totaltime;
506fd7d9bd3Smrg  char buf[80];
507fd7d9bd3Smrg
508fd7d9bd3Smrg  num_strings *= X.percent;
509fd7d9bd3Smrg
510fd7d9bd3Smrg  GC_change_font(unicode_font,FALSE);
511fd7d9bd3Smrg
512fd7d9bd3Smrg  XSync(X.dpy,0);
513fd7d9bd3Smrg  start_timer();
514fd7d9bd3Smrg  for (i=0;i<num_strings;++i) {
515fd7d9bd3Smrg    XDrawString16(X.dpy,X.win,X.gc,(i%2 ? i : num_strings - i),10*i,
516fd7d9bd3Smrg		  string16,sizeof(string16)/sizeof(XChar2b));
517fd7d9bd3Smrg  }
518fd7d9bd3Smrg  XSync(X.dpy,0);
519fd7d9bd3Smrg  totaltime = end_timer();
520fd7d9bd3Smrg
521fd7d9bd3Smrg  GC_change_font(X.fontname,FALSE);
522fd7d9bd3Smrg
523fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d strings in %.2f seconds.",num_strings,
524fd7d9bd3Smrg	  (double) totaltime/1000000.);
525fd7d9bd3Smrg  show_result(buf);
526fd7d9bd3Smrg}
527fd7d9bd3Smrg
528fd7d9bd3Smrgvoid
529fd7d9bd3Smrgimagetext16_test(void)
530fd7d9bd3Smrg{
531fd7d9bd3Smrg  int num_strings = 50;
532fd7d9bd3Smrg  int i;
533fd7d9bd3Smrg  long totaltime;
534fd7d9bd3Smrg  char buf[80];
535fd7d9bd3Smrg
536fd7d9bd3Smrg  num_strings *= X.percent;
537fd7d9bd3Smrg
538fd7d9bd3Smrg  GC_change_font(unicode_font,FALSE);
539fd7d9bd3Smrg
540fd7d9bd3Smrg  XSync(X.dpy,0);
541fd7d9bd3Smrg  start_timer();
542fd7d9bd3Smrg  for (i=0;i<num_strings;++i) {
543fd7d9bd3Smrg    XDrawImageString16(X.dpy,X.win,X.gc,(i%2 ? i : num_strings - i),10*i,
544fd7d9bd3Smrg		       string16,sizeof(string16)/sizeof(XChar2b));
545fd7d9bd3Smrg  }
546fd7d9bd3Smrg  XSync(X.dpy,0);
547fd7d9bd3Smrg  totaltime = end_timer();
548fd7d9bd3Smrg
549fd7d9bd3Smrg  GC_change_font(X.fontname,FALSE);
550fd7d9bd3Smrg
551fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%d strings in %.2f seconds.",num_strings,
552fd7d9bd3Smrg	  (double) totaltime/1000000.);
553fd7d9bd3Smrg  show_result(buf);
554fd7d9bd3Smrg}
555fd7d9bd3Smrg
556fd7d9bd3Smrgvoid
557fd7d9bd3Smrgputimage_test(void)
558fd7d9bd3Smrg{
559fd7d9bd3Smrg  int num_copies = 200;
560fd7d9bd3Smrg  int i;
561fd7d9bd3Smrg  long totaltime;
562fd7d9bd3Smrg  char buf[80];
563fd7d9bd3Smrg
564fd7d9bd3Smrg  num_copies *= X.percent;
565fd7d9bd3Smrg
566fd7d9bd3Smrg  XSetFillStyle(X.dpy,X.miscgc,FillTiled);
567fd7d9bd3Smrg  XFillRectangle(X.dpy,X.win,X.miscgc,0,0,400,400);
568fd7d9bd3Smrg
569fd7d9bd3Smrg  X.image = XGetImage(X.dpy,X.win,0,0,200,200,~0,XYPixmap);
570fd7d9bd3Smrg
571fd7d9bd3Smrg  XSync(X.dpy,0);
572fd7d9bd3Smrg  timer(StartTimer);
573fd7d9bd3Smrg  for (i=0;i<num_copies;++i)
574fd7d9bd3Smrg    XPutImage(X.dpy,X.win,X.gc,X.image,0,0,i,i,200,200);
575fd7d9bd3Smrg  XSync(X.dpy,0);
576fd7d9bd3Smrg  totaltime = timer(EndTimer);
577fd7d9bd3Smrg
578fd7d9bd3Smrg  snprintf(buf,sizeof buf,"%.2f seconds.",(double)totaltime/1000000.);
579fd7d9bd3Smrg  show_result(buf);
580fd7d9bd3Smrg}
581fd7d9bd3Smrg
582fd7d9bd3Smrg
583fd7d9bd3Smrg/*****************************/
584fd7d9bd3Smrg/*****************************/
585fd7d9bd3Smrg
586fd7d9bd3Smrgvoid
587fd7d9bd3Smrgrun_test(void)
588fd7d9bd3Smrg{
589fd7d9bd3Smrg  XClearWindow(X.dpy,X.win);
590fd7d9bd3Smrg
591fd7d9bd3Smrg  print_if_recording("run\n");
592fd7d9bd3Smrg
593fd7d9bd3Smrg  switch (X.test) {
594fd7d9bd3Smrg    case CopyArea:      copyarea_test();           break;
595fd7d9bd3Smrg    case CopyPlane:     copyplane_test();          break;
596fd7d9bd3Smrg    case PolyPoint:     polypoint_test();          break;
597fd7d9bd3Smrg    case PolyLine:      polyline_test();           break;
598fd7d9bd3Smrg    case PolySegment:   polysegment_test();        break;
599fd7d9bd3Smrg    case PolyRectangle: polyrectangle_test();      break;
600fd7d9bd3Smrg    case PolyArc:       polyarc_test();            break;
601fd7d9bd3Smrg    case FillPolygon:   fillpolygon_test();        break;
602fd7d9bd3Smrg    case PolyFillRect:  polyfillrectangle_test();  break;
603fd7d9bd3Smrg    case PolyFillArc:   polyfillarc_test();        break;
604fd7d9bd3Smrg    case PolyText8:     polytext8_test();          break;
605fd7d9bd3Smrg    case ImageText8:    imagetext8_test();         break;
606fd7d9bd3Smrg    case PolyText16:    polytext16_test();         break;
607fd7d9bd3Smrg    case ImageText16:   imagetext16_test();        break;
608fd7d9bd3Smrg    case PutImage:      putimage_test();           break;
609fd7d9bd3Smrg    default: fprintf(stderr,"That test doesn't exist yet.\n");
610fd7d9bd3Smrg    }
611fd7d9bd3Smrg}
612fd7d9bd3Smrg
613fd7d9bd3Smrg/*****************************/
614fd7d9bd3Smrg
615fd7d9bd3Smrg/* set_text(w,string)
616fd7d9bd3Smrg** ------------------
617fd7d9bd3Smrg** Sets the text in a read-only text widget to the specified string.
618fd7d9bd3Smrg*/
619fd7d9bd3Smrg
620fd7d9bd3Smrgvoid
621fd7d9bd3Smrgset_text(Widget w, char *string)
622fd7d9bd3Smrg{
623fd7d9bd3Smrg  static Arg args[2];
624fd7d9bd3Smrg
625fd7d9bd3Smrg  XtSetArg(args[0], XtNstring, string);
626fd7d9bd3Smrg  XtSetArg(args[1], XtNlength, strlen(string));
627fd7d9bd3Smrg  XtSetValues(w, args, (Cardinal) 2 );
628fd7d9bd3Smrg}
629fd7d9bd3Smrg
630fd7d9bd3Smrgvoid
631fd7d9bd3Smrgshow_result(char *string)
632fd7d9bd3Smrg{
633fd7d9bd3Smrg  char buf[80];
634fd7d9bd3Smrg
635fd7d9bd3Smrg  set_text(result,string);
636fd7d9bd3Smrg
637fd7d9bd3Smrg  strcpy(buf,"# ");
638fd7d9bd3Smrg  strncat(buf,string,sizeof(buf) - 3);
639fd7d9bd3Smrg  buf[sizeof(buf) - 3] = '\0';
640fd7d9bd3Smrg  strcat(buf,"\n");
641fd7d9bd3Smrg  print_if_recording(buf);
642fd7d9bd3Smrg}
643