⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testgfxprimitives.c

📁 sdl的gfx开发包
💻 C
📖 第 1 页 / 共 4 页
字号:
/*  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 + -