📄 testgfxprimitives.c
字号:
/* TestGfxPrimitives Test graphics primitive routines for accuracy (visual) and speed. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <time.h>#include <SDL/SDL.h>#include "SDL/SDL_gfxPrimitives.h"#define WIDTH 640#define HEIGHT 480#define NUM_RANDOM 512/* Coordinates */static Sint16 rx1[NUM_RANDOM], rx2[NUM_RANDOM], ry1[NUM_RANDOM], ry2[NUM_RANDOM];/* Radii and offsets */static Sint16 rr1[NUM_RANDOM], rr2[NUM_RANDOM];/* Start and stop angles */static Sint16 a1[NUM_RANDOM], a2[NUM_RANDOM];/* RGB colors and alpha */static char rr[NUM_RANDOM], rg[NUM_RANDOM], rb[NUM_RANDOM], ra[NUM_RANDOM];/* Generate an array of random screen coordinates and RGBA values with an offset */void InitRandomPoints(){ int i; float af; for (i=0; i<NUM_RANDOM; i++) { rx1[i]=rand() % (WIDTH/2); rx2[i]=WIDTH/2+rx1[i]; ry1[i]=60+(rand() % ((HEIGHT-80)/2)); ry2[i]=20+((HEIGHT-80)/2)+ry1[i]; rr1[i]=rand() % 32; rr2[i]=rand() % 32; a1[i]=rand() % 360; a2[i]=rand() % 360; rr[i]=rand() & 255; rg[i]=rand() & 255; rb[i]=rand() & 255; af=((float)rx1[i]/(float)(WIDTH/2)); ra[i]=(int)(255.0*af); } }#define BORDER 10/* Set a clipping rectangle based on a rect with a border */void SetClip (SDL_Surface *screen, int x1, int y1, int x2, int y2){ SDL_Rect clip; clip.x = x1+BORDER; clip.y = y1+BORDER; clip.w = x2-x1-2*BORDER; clip.h = y2-y1-2*BORDER; SDL_SetClipRect(screen, &clip);}void SetClipNoBorder (SDL_Surface *screen, int x1, int y1, int x2, int y2){ SDL_Rect clip; clip.x = x1; clip.y = y1; clip.w = x2-x1; clip.h = y2-y1; SDL_SetClipRect(screen, &clip);}void ClearScreen(SDL_Surface *screen, char *title){ int x,y; float stepx, stepy, fx, fy, fxy; char titletext[256]; Uint32 color; /* Setup clear color color */ if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color=SDL_MapRGBA(screen->format, 0,0,0,0); } else { color=SDL_MapRGBA(screen->format, 0,0,0,0); } /* Clear the screen */ SetClipNoBorder (screen,0,0,WIDTH-1,HEIGHT-1); SDL_FillRect (screen, NULL, color); /* Draw the colored area */ stepx=1.0/(WIDTH/2); stepy=1.0/((HEIGHT-80)/2); fx=0.0; for (x=WIDTH/2; x<WIDTH; x++) { fy=0.0; for (y=(HEIGHT-40)/2+60; y<HEIGHT; y++) { fxy=1.0-fx*fy; pixelRGBA(screen,x,y,(int)(128.0*fx*fx),(int)(128.0*fxy*fxy),(int)(128.0*fy*fy),255); fy += stepy; } fx += stepx; } /* Segment and titles */ hlineRGBA(screen, 0, WIDTH, 20-1, 255,255,255,255); hlineRGBA(screen, 0, WIDTH, 60-1, 255,255,255,255); hlineRGBA(screen, 0, WIDTH, (HEIGHT-40)/2+40+1, 255,255,255,255); hlineRGBA(screen, 0, WIDTH, (HEIGHT-40)/2+60-1, 255,255,255,255); vlineRGBA(screen, WIDTH/2, 20, HEIGHT, 255,255,255,255); strncpy(titletext,"Current Primitive: ",256); strncat(titletext,title,256); strncat(titletext," - Click for continue. Key to Quit.",256); stringRGBA (screen, WIDTH/2-4*strlen(titletext),10-4,titletext,255,255,255,255); strncpy(titletext,"A=255 on Black",256); stringRGBA (screen, WIDTH/4-4*strlen(titletext),50-4,titletext,255,255,255,255); strncpy(titletext,"A=0-254 on Black",256); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),50-4,titletext,255,255,255,255); strncpy(titletext,"A=255, Color Test",256); stringRGBA (screen, WIDTH/4-4*strlen(titletext),(HEIGHT-40)/2+50-4,titletext,255,255,255,255); strncpy(titletext,"A=0-254 on Color",256); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),(HEIGHT-40)/2+50-4,titletext,255,255,255,255);}/* ======== Test and Benchmark routines ======= */void TestPixel(SDL_Surface *screen){ int i; char r,g,b; /* Create random points */ srand(time(NULL)); InitRandomPoints(); /* Draw A=255 */ SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i++) { pixelRGBA(screen, rx1[i], ry1[i], rr[i], rg[i], rb[i], 255); } /* Draw A=various */ SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i++) { pixelRGBA(screen, rx2[i], ry1[i], rr[i], rg[i], rb[i], ra[i]); } /* Draw A=various */ SetClip(screen,WIDTH/2,80+(HEIGHT-80)/2,WIDTH,HEIGHT); for (i=0; i<NUM_RANDOM; i++) { pixelRGBA(screen, rx2[i], ry2[i], rr[i], rg[i], rb[i], ra[i]); } /* Draw Colortest */ SetClip(screen,0,80+(HEIGHT-80)/2,WIDTH/2,HEIGHT); for (i=0; i<NUM_RANDOM; i++) { if (rx1[i] < (WIDTH/6)) { r=255; g=0; b=0; } else if (rx1[i] < (WIDTH/3) ) { r=0; g=255; b=0; } else { r=0; g=0; b=255; } pixelRGBA(screen, rx1[i], ry2[i], r, g, b, 255); }}void BenchmarkPixel(SDL_Surface *screen){ int i,j; int repeat; Uint32 time1, time2; char titletext[256]; /* Draw A=255 */ repeat=200; SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { pixelRGBA(screen, rx1[i], ry1[i], rr[i], rg[i], rb[i], 255); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255); /* Draw A=various */ repeat=100; SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { pixelRGBA(screen, rx2[i], ry1[i], rr[i], rg[i], rb[i], ra[i]); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255);}void TestHline(SDL_Surface *screen){ int i; char r,g,b; /* Create random points */ srand(time(NULL)); InitRandomPoints(); /* Draw A=255 */ SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { hlineRGBA(screen, rx1[i], rx1[i+1], ry1[i+1], rr[i], rg[i], rb[i], 255); } /* Draw A=various */ SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { hlineRGBA(screen, rx2[i], rx2[i+1], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw A=various */ SetClip(screen,WIDTH/2,80+(HEIGHT-80)/2,WIDTH,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { hlineRGBA(screen, rx2[i], rx2[i+1], ry2[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw Colortest */ SetClip(screen,0,80+(HEIGHT-80)/2,WIDTH/2,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { if (rx1[i] < (WIDTH/6)) { r=255; g=0; b=0; } else if (rx1[i] < (WIDTH/3) ) { r=0; g=255; b=0; } else { r=0; g=0; b=255; } hlineRGBA(screen, rx1[i], rx1[i]+rr1[i], ry2[i+1], r, g, b, 255); }}void BenchmarkHline(SDL_Surface *screen){ int i,j; int repeat; Uint32 time1, time2; char titletext[256]; /* Draw A=255 */ repeat=200; SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { hlineRGBA(screen, rx1[i], rx1[i+1], ry1[i+1], rr[i], rg[i], rb[i], 255); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255); /* Draw A=various */ repeat=100; SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { hlineRGBA(screen, rx2[i], rx2[i+1], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255);}void TestVline(SDL_Surface *screen){ int i; char r,g,b; /* Create random points */ srand(time(NULL)); InitRandomPoints(); /* Draw A=255 */ SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { vlineRGBA(screen, rx1[i], ry1[i], ry1[i+1], rr[i], rg[i], rb[i], 255); } /* Draw A=various */ SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { vlineRGBA(screen, rx2[i], ry1[i], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw A=various */ SetClip(screen,WIDTH/2,80+(HEIGHT-80)/2,WIDTH,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { vlineRGBA(screen, rx2[i], ry2[i], ry2[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw Colortest */ SetClip(screen,0,80+(HEIGHT-80)/2,WIDTH/2,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { if (rx1[i] < (WIDTH/6)) { r=255; g=0; b=0; } else if (rx1[i] < (WIDTH/3) ) { r=0; g=255; b=0; } else { r=0; g=0; b=255; } vlineRGBA(screen, rx1[i], ry2[i], ry2[i]+rr1[i], r, g, b, 255); }}void BenchmarkVline(SDL_Surface *screen){ int i,j; int repeat; Uint32 time1, time2; char titletext[256]; /* Draw A=255 */ repeat=200; SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { vlineRGBA(screen, rx1[i], ry1[i], ry1[i+1], rr[i], rg[i], rb[i], 255); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255); /* Draw A=various */ repeat=100; SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { vlineRGBA(screen, rx2[i], ry1[i], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)(NUM_RANDOM*repeat)/(float)(time2-time1)); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255);}void TestRectangle(SDL_Surface *screen){ int i; char r,g,b; /* Create random points */ srand(time(NULL)); InitRandomPoints(); /* Draw A=255 */ SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { rectangleRGBA(screen, rx1[i], ry1[i], rx1[i+1], ry1[i+1], rr[i], rg[i], rb[i], 255); } /* Draw A=various */ SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i += 2) { rectangleRGBA(screen, rx2[i], ry1[i], rx2[i+1], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw A=various */ SetClip(screen,WIDTH/2,80+(HEIGHT-80)/2,WIDTH,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { rectangleRGBA(screen, rx2[i], ry2[i], rx2[i+1], ry2[i+1], rr[i], rg[i], rb[i], ra[i]); } /* Draw Colortest */ SetClip(screen,0,80+(HEIGHT-80)/2,WIDTH/2,HEIGHT); for (i=0; i<NUM_RANDOM; i += 2) { if (rx1[i] < (WIDTH/6)) { r=255; g=0; b=0; } else if (rx1[i] < (WIDTH/3) ) { r=0; g=255; b=0; } else { r=0; g=0; b=255; } rectangleRGBA(screen, rx1[i], ry2[i], rx1[i]+rr1[i], ry2[i]+rr2[i], r, g, b, 255); }}void BenchmarkRectangle(SDL_Surface *screen){ int i,j; int repeat; Uint32 time1, time2; char titletext[256]; /* Draw A=255 */ repeat=200; SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i += 2) { rectangleRGBA(screen, rx1[i], ry1[i], rx1[i+1], ry1[i+1], rr[i], rg[i], rb[i], 255); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)((NUM_RANDOM/2)*repeat)/(float)(time2-time1)); stringRGBA (screen, WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255); /* Draw A=various */ repeat=10; SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i += 2) { rectangleRGBA(screen, rx2[i], ry1[i], rx2[i+1], ry1[i+1], rr[i], rg[i], rb[i], ra[i]); } } time2=SDL_GetTicks(); /* Results */ SetClip(screen,0,0,WIDTH-1,HEIGHT-1); sprintf (titletext, "%.0f per sec",1000.0*(float)((NUM_RANDOM/2)*repeat)/(float)(time2-time1)); stringRGBA (screen, 3*WIDTH/4-4*strlen(titletext),30-4,titletext,255,255,255,255);}void TestBoxTwo(SDL_Surface *screen){ int i; char r,g,b; /* Create random points */ srand(time(NULL)); InitRandomPoints(); /* Draw A=255 */ SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i++) { boxRGBA(screen, rx1[i], ry1[i], rx1[i]+1, ry1[i]+1, rr[i], rg[i], rb[i], 255); } /* Draw A=various */ SetClip(screen,WIDTH/2,60,WIDTH,60+(HEIGHT-80)/2); for (i=0; i<NUM_RANDOM; i++) { boxRGBA(screen, rx2[i], ry1[i], rx2[i]+1, ry1[i]+1, rr[i], rg[i], rb[i], ra[i]); } /* Draw A=various */ SetClip(screen,WIDTH/2,80+(HEIGHT-80)/2,WIDTH,HEIGHT); for (i=0; i<NUM_RANDOM; i++) { boxRGBA(screen, rx2[i], ry2[i], rx2[i]+1, ry2[i]+1, rr[i], rg[i], rb[i], ra[i]); } /* Draw Colortest */ SetClip(screen,0,80+(HEIGHT-80)/2,WIDTH/2,HEIGHT); for (i=0; i<NUM_RANDOM; i++) { if (rx1[i] < (WIDTH/6)) { r=255; g=0; b=0; } else if (rx1[i] < (WIDTH/3) ) { r=0; g=255; b=0; } else { r=0; g=0; b=255; } boxRGBA(screen, rx1[i], ry2[i], rx1[i]+1, ry2[i]+1, r, g, b, 255); }}void BenchmarkBoxTwo(SDL_Surface *screen){ int i,j; int repeat; Uint32 time1, time2; char titletext[256]; /* Draw A=255 */ repeat=50; SetClip(screen,0,60,WIDTH/2,60+(HEIGHT-80)/2); time1=SDL_GetTicks(); for (j=0; j<repeat; j++) { for (i=0; i<NUM_RANDOM; i++) { boxRGBA(screen, rx1[i], ry1[i], rx1[i]+1, ry1[i]+1, rr[i], rg[i], rb[i], 255); } } time2=SDL_GetTicks(); /* Results */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -