Mercurial > hg > dmlib
diff vptest.c @ 0:32250b436bca
Initial re-import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 28 Sep 2012 01:54:23 +0300 |
parents | |
children | eb0072860fb0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vptest.c Fri Sep 28 01:54:23 2012 +0300 @@ -0,0 +1,328 @@ +#include "dmlib.h" +#include "dmargs.h" +#include "dmvecmat.h" +#include "dmres.h" +#include "dmimage.h" +#include <math.h> + +#define DM_COLORS (256) + +char *optFontFile = "font.ttf", + *optBitmapFilename = "map.png"; +BOOL optBenchmark = FALSE; +int optVFlags = SDL_SWSURFACE | SDL_HWPALETTE; +int optScrWidth = 640, optScrHeight = 480, optFontSize = 20, optScrDepth = 32; +int optBenchmarkLen = 20; + +DMOptArg optList[] = { + { 0, '?', "help", "Show this help", OPT_NONE }, + { 2, 'v', "verbose", "Be more verbose", OPT_NONE }, + { 3, 'f', "full", "Fullscreen", OPT_NONE }, + { 4, 'h', "hw", "Use SDL hardware surface", OPT_NONE }, + { 5, 's', "size", "Initial window size/resolution -s 640x480", OPT_ARGREQ }, + { 6, 'd', "depth", "Color depth of mode/window in bits (8/15/16/32)", OPT_ARGREQ }, + { 7, 'b', "bench", "Run in benchmark mode", OPT_NONE }, +}; + +const int optListN = sizeof(optList) / sizeof(optList[0]); + + +void argShowHelp() +{ + dmArgsPrintHelp(stdout, optList, optListN); +} + + +BOOL argHandleOpt(const int optN, char *optArg, char *currArg) +{ + switch (optN) { + case 0: + argShowHelp(); + exit(0); + break; + + case 2: + dmVerbosity++; + break; + + case 3: + optVFlags |= SDL_FULLSCREEN; + break; + + case 6: + if (optArg) + optScrDepth = atoi(optArg); + break; + + case 5: + { + int w, h; + if (sscanf(optArg, "%dx%d", &w, &h) == 2) + { + if (w < 320 || h < 200 || w > 3200 || h > 3200) + { + dmError("Invalid width or height: %d x %d\n", w, h); + return FALSE; + } + optScrWidth = w; + optScrHeight = h; + } + else + { + dmError("Invalid size argument '%s'.\n", optArg); + return FALSE; + } + } + break; + + case 7: + optBenchmark = TRUE; + break; + + default: + dmError("Unknown option '%s'.\n", currArg); + return FALSE; + } + + return TRUE; +} + + +void DM_MakePalette(SDL_Surface *scr) +{ + SDL_Color pal[DM_COLORS]; + int n; + + for (n = 0; n < 256; n++) + { + pal[n].r = n; + pal[n].g = n; + pal[n].b = n; + } + + SDL_SetColors(scr, pal, 0, DM_COLORS); +} + + +void DM_PrintRect(FILE *f, SDL_Rect *r) +{ + fprintf(f, "SDL_Rect <%d, %d : %d, %d>\n", + r->x, r->y, r->w, r->h); +} + +BOOL DM_InitializeVideo(SDL_Surface **screen) +{ + *screen = SDL_SetVideoMode(optScrWidth, optScrHeight, optScrDepth, optVFlags | SDL_RESIZABLE); + if (*screen == NULL) + { + dmError("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); + return FALSE; + } + +#if 0 + SDL_Rect r; + r.x = 50; + r.y = 50; + r.w = 320; + r.h = 200; + DM_PrintRect(stderr, &r); + SDL_SetClipRect(*screen, &r); + DM_PrintRect(stderr, &r); + DM_PrintRect(stderr, &((*screen)->clip_rect)); +#endif + + return TRUE; +} + + +int main(int argc, char *argv[]) +{ + SDL_Surface *screen = NULL, *bmap = NULL; + TTF_Font *font = NULL; + SDL_Color fontcol={255,155,155,0}; + SDL_Event event; + int mouseX, mouseY, bx, by; + BOOL initSDL = FALSE, initTTF = FALSE, exitFlag; + + dmVerbosity = 5; + if (!dmArgsProcess(argc, argv, optList, optListN, + argHandleOpt, NULL, FALSE)) + exit(1); + + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) + { + dmError("Could not initialize SDL: %s\n", SDL_GetError()); + goto error_exit; + } + initSDL = TRUE; + + + if (TTF_Init() < 0) + { + dmError("Could not initialize FreeType/TTF: %s\n", SDL_GetError()); + goto error_exit; + } + initTTF = TRUE; + + font = TTF_OpenFont(optFontFile, optFontSize); + if (font == NULL) + { + dmError("Could not load TTF font '%s' (%d): %s\n", + optFontFile, optFontSize, SDL_GetError()); + goto error_exit; + } + TTF_SetFontStyle(font, TTF_STYLE_NORMAL); + + DMResource *res = dmf_create_stdio(optBitmapFilename); + if (res == NULL) + { + dmError("Could not open resource file '%s'.\n", optBitmapFilename); + goto error_exit; + } + bmap = dmLoadImage(res); + dmf_close(res); + if (bmap == NULL) + { + dmError("Could not load image file '%s'.\n", optBitmapFilename); + goto error_exit; + } + + if (optBenchmark) + { + screen = SDL_CreateRGBSurface(SDL_SWSURFACE, optScrWidth, optScrHeight, optScrDepth, 0, 0, 0, 0); + if (screen == NULL) + { + dmError("Could not create screen surface.\n"); + goto error_exit; + } + + dmMsg(0, "Benchmark mode, not opening window.\n"); + } + else + { + if (!DM_InitializeVideo(&screen)) + goto error_exit; + + SDL_WM_SetCaption("Halleluja", "DMT"); + } + + int numFrames = 0, startTime = SDL_GetTicks(), endTime = 0; + exitFlag = FALSE; + + if (optBenchmark) + dmMsg(0, "Starting benchmark, running for %d seconds.\n", optBenchmarkLen); + + while (!exitFlag) + { + if (!optBenchmark) + { + while (SDL_PollEvent(&event)) + switch (event.type) + { + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_ESCAPE: exitFlag = TRUE; break; + + default: + break; + } + + break; + + case SDL_VIDEORESIZE: + optScrWidth = event.resize.w; + optScrHeight = event.resize.h; + + if (!DM_InitializeVideo(&screen)) + goto error_exit; + + break; + + case SDL_VIDEOEXPOSE: + break; + + case SDL_QUIT: + exit(0); + } + + SDL_GetMouseState(&mouseX, &mouseY); + bx = 300 - ((DMFloat) mouseX * 500.0f ) / (DMFloat) optScrWidth; + by = 300 - ((DMFloat) mouseY * 500.0f ) / (DMFloat) optScrHeight; + } + + if (!optBenchmark && SDL_MUSTLOCK(screen) != 0 && SDL_LockSurface(screen) != 0) + { + dmError("Can't lock surface.\n"); + goto error_exit; + } + + + dmClearSurface(screen, 0); + + float f = SDL_GetTicks() / 50.0f, + qw = (float) 32.0 * (1.0 + sin(f) * 0.1), + qh = (float) 32.0 * (1.0 + sin(f) * 0.1), + qw2 = (float) 132.0 * (1.0 + sin(f) * 0.1), + qh2 = (float) 132.0 * (1.0 + sin(f) * 0.1); + + dmScaledBlitSurfaceAny(bmap, bx-qw2, by-qh2, bmap->w+qw2, bmap->h+qh2, screen, +// DMD_NONE + DMD_SATURATE + ); + + dmScaledBlitSurfaceAny(bmap, bx-qw, by-qh, bmap->w+qw, bmap->h+qh, screen, +// DMD_NONE + DMD_TRANSPARENT +// DMD_SATURATE + ); +// fprintf(stderr, "%d -> %d : %d\n", bmap->format->BitsPerPixel, screen->format->BitsPerPixel, rt); +// exitFlag=TRUE; + + if (!optBenchmark) + { + dmDrawTTFText(screen, font, fontcol, 0, 0, "%3.1f FPS", + (float) (numFrames * 1000.0f) / (float) (endTime - startTime)); + + if (SDL_MUSTLOCK(screen) != 0) + SDL_UnlockSurface(screen); + + SDL_Flip(screen); + SDL_Delay(25); + } + + endTime = SDL_GetTicks(); + numFrames++; + + if (optBenchmark) + { + if (endTime - startTime > optBenchmarkLen * 1000) + exitFlag = TRUE; + } + } + + // Print benchmark results + dmMsg(0, "%d frames in %d ms, fps = %1.3f\n", + numFrames, endTime - startTime, + (float) (numFrames * 1000.0f) / (float) (endTime - startTime)); + + +error_exit: + dmMsg(0, "Shutting down dmlib.\n"); + if (screen) + SDL_FreeSurface(screen); + + if (bmap) + SDL_FreeSurface(bmap); + + if (font) + TTF_CloseFont(font); + + if (initSDL) + SDL_Quit(); + + if (initTTF) + TTF_Quit(); + + return 0; +}