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