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