Mercurial > hg > dmlib
changeset 619:6c23042c546f
Aaaand some more work on mode selector.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 12 Apr 2013 15:32:37 +0300 |
parents | a1f70e85a5ca |
children | 5fda51e99fe5 |
files | dmsimple.c |
diffstat | 1 files changed, 96 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/dmsimple.c Fri Apr 12 13:33:17 2013 +0300 +++ b/dmsimple.c Fri Apr 12 15:32:37 2013 +0300 @@ -17,7 +17,6 @@ { { 0, '?', "help", "Show this help", OPT_NONE }, { 1, 'v', "verbose", "Be more verbose", OPT_NONE }, - { 2, 'f', "fs", "Fullscreen", OPT_NONE }, }; const int optListN = sizeof(optList) / sizeof(optList[0]); @@ -46,10 +45,6 @@ dmVerbosity++; break; - case 2: - engine.optVFlags |= SDL_FULLSCREEN; - break; - default: dmError("Unknown option '%s'.\n", currArg); return FALSE; @@ -168,18 +163,89 @@ } +typedef struct +{ + int w, h; +} DMModeEntry; + + +DMModeEntry *engineModeList = NULL; +int nengineModeList = 0, aengineModeList = 0; + + +static int engineModeSort(const void *pa, const void *pb) +{ + DMModeEntry + *va = (DMModeEntry *) pa, + *vb = (DMModeEntry *) pb; + + return (va->w - vb->w); +} + + +int engineAddModeToList(int w, int h) +{ + DMModeEntry *mode; + int i; + + // Check if the mode is already in our list + for (i = 0; i < nengineModeList; i++) + { + mode = &engineModeList[i]; + if (mode->w == w && mode->h == h) + return DMERR_OK; + } + + // Reallocate array if needed + if (nengineModeList + 1 >= aengineModeList) + { + aengineModeList += 16; + engineModeList = dmRealloc(engineModeList, sizeof(DMModeEntry) * aengineModeList); + if (engineModeList == NULL) + return DMERR_MALLOC; + } + + // Store + mode = &engineModeList[nengineModeList]; + mode->w = w; + mode->h = h; + + nengineModeList++; + + return DMERR_OK; +} + int engineVideoSetup() { DMBitmapFont *menuFont = NULL; DMResource *file = NULL; SDL_Surface *menuBgImage = NULL, *menuBarImage = NULL; - int result, menuState = -1, nmenuList, menuChoice = 0; + int result, menuState = -1, menuChoice = 0; + BOOL fullScreen = TRUE; char menuStr[64]; // Compute a list of valid modes + if (!engineGenInitializeVideo(DM_VSETUP_WIDTH, DM_VSETUP_HEIGHT, engine.optVidDepth, engine.optVFlags)) + goto out; + SDL_Rect **modes = SDL_ListModes(engine.screen->format, engine.screen->flags | SDL_FULLSCREEN); + if (modes == (SDL_Rect**) 0) + { + dmError("No compatible video resolutions/depths available at all. Bailing out.\n"); + goto out; + } + + if (modes != (SDL_Rect**) -1) + { + int i; + for (i = 0; modes[i] != NULL; i++) + engineAddModeToList(modes[i]->w, modes[i]->h); + } + + qsort(engineModeList, nengineModeList, sizeof(engineModeList[0]), engineModeSort); + // Open video temporarily if (!engineGenInitializeVideo(DM_VSETUP_WIDTH, DM_VSETUP_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF)) goto out; @@ -263,7 +329,6 @@ menuState = -1; break; - case SDLK_SPACE: case SDLK_RETURN: menuState = 1; break; @@ -274,9 +339,13 @@ break; case SDLK_DOWN: - if (menuChoice < nmenuList - 1) + if (menuChoice < nengineModeList - 1) menuChoice++; break; + + case SDLK_SPACE: + fullScreen = !fullScreen; + break; default: break; @@ -303,7 +372,6 @@ // XXX/TODO: Some hardcoded bits here ... float t = engineGetTimeDT(&engine); int entry; - nmenuList = 5; dmScaledBlitSurface32to32TransparentGA(menuBarImage, DM_VSETUP_MENU_XC, DM_VSETUP_MENU_YC + (menuChoice * menuEntryHeight), @@ -311,9 +379,13 @@ engine.screen, 200 + sin(t * 10.0) * 50); - for (entry = 0; entry < nmenuList && entry < menuHeight; entry++) + for (entry = 0; entry < nengineModeList && entry < menuHeight; entry++) { - snprintf(menuStr, sizeof(menuStr), "%4d X %4d", 640 * (entry + 1), 480 * (entry + 1)); + DMModeEntry *mode = &engineModeList[entry]; + + snprintf(menuStr, sizeof(menuStr), + "%4d X %4d", mode->w, mode->h); + dmDrawBMTextConst( engine.screen, menuFont, DMD_TRANSPARENT, DM_VSETUP_MENU_XC + 2, @@ -321,6 +393,19 @@ menuStr); } + dmDrawBMTextConst( + engine.screen, menuFont, DMD_TRANSPARENT, + 80, + DM_VSETUP_MENU_YC + menuEntryHeight * (1 + menuHeight), + fullScreen ? + "[ FULLSCREEN ] - SPACE TO TOGGLE" : + "[ WINDOWED ] - SPACE TO TOGGLE"); + + dmDrawBMTextConst( + engine.screen, menuFont, DMD_TRANSPARENT, + 80, + DM_VSETUP_MENU_YC + menuEntryHeight * (2 + menuHeight), + " PRESS [ENTER] TO START "); // Flip screen if (SDL_MUSTLOCK(engine.screen) != 0)