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