Mercurial > hg > dmlib
changeset 578:cf5d44b36851
Add some initial code for video setup screen.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 12 Apr 2013 04:44:25 +0300 |
parents | 742a05f64929 |
children | f87446a81887 |
files | dmengine.h dmsimple.c |
diffstat | 2 files changed, 150 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/dmengine.h Wed Apr 10 11:59:02 2013 +0300 +++ b/dmengine.h Fri Apr 12 04:44:25 2013 +0300 @@ -211,7 +211,11 @@ SDL_Surface *screen; SDL_Event event; SDL_AudioSpec optAfmt; - int optScrWidth, optScrHeight, optVFlags, optBitDepth, optResFlags; + + int optScrWidth, optScrHeight, + optScrDepth, optVFlags, optScrAspect; + + int optResFlags; char *optDataPath, *optPackFilename; #ifdef DM_USE_JSS
--- a/dmsimple.c Wed Apr 10 11:59:02 2013 +0300 +++ b/dmsimple.c Fri Apr 12 04:44:25 2013 +0300 @@ -114,8 +114,9 @@ static int engineLoadResources() { - int err, loaded, total; - + int err, loaded = 0, total = 0; + + // First preload outside of the loop err = dmres_preload(engine.resources, TRUE, &loaded, &total); while ((err = dmres_preload(engine.resources, FALSE, &loaded, &total)) == DMERR_PROGRESS) @@ -132,23 +133,154 @@ } -static BOOL engineInitializeVideo() +static BOOL engineGenInitializeVideo(int width, int height, int depth, Uint32 flags) { dmPrint(1, "Initializing SDL video %d x %d x %dbpp, flags=0x%08x\n", - engine.optScrWidth, engine.optScrHeight, engine.optBitDepth, engine.optVFlags); + width, height, depth, flags); SDL_FreeSurface(engine.screen); - engine.screen = SDL_SetVideoMode(engine.optScrWidth, engine.optScrHeight, engine.optBitDepth, engine.optVFlags); + engine.screen = SDL_SetVideoMode(width, height, depth, flags); if (engine.screen == NULL) { dmError("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); return FALSE; } + + SDL_ShowCursor(SDL_DISABLE); + SDL_WM_SetCaption(dmProgDesc, dmProgName); + return TRUE; } +static BOOL engineInitializeVideo(int width, int height, int depth, Uint32 flags) +{ + return engineInitializeVideo(engine.optScrWidth, engine.optScrHeight, + engine.optScrDepth, engine.optVFlags); +} + + +int engineVideoSetup() +{ + DMBitmapFont *font = NULL; + DMResource *file = NULL; + SDL_Surface *menuBgImage = NULL; + int menuState = -1, nmenuList; + DMScaledBlitFunc menuBgBlit; + + // Compute a list of valid modes + + + // Open video temporarily + if (!engineGenInitializeVideo(DM_VIDEO_SETUP_WIDTH, DM_VIDEO_SETUP_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF)) + goto out; + + // Fetch and decompress setup image, try regular resources first + file = dmf_open(engine.resources, "SetupImage.png"); + if (file == NULL) + file = dmf_create_memio(NULL, "SetupImage", engineSetupImage, sizeof(engineSetupImage)); + + menuBgImage = dmLoadImageBitmapFont(file); + dmf_close(file); + if (menuBgImage == NULL) + { + dmError("Could not instantiate setup screen image, %d: %s\n", + result, dmErrorStr(result)); + goto out; + } + + if (menuBgImage->w != DM_VIDEO_SETUP_WIDTH || + menuBgImage->h != DM_VIDEO_SETUP_HEIGHT) + { + dmError("Setup screen background image does not match " + "required dimensions (%dx%d vs %dx%d)\n", + menuBgImage->w, menuBgImage->h, + DM_VIDEO_SETUP_WIDTH, DM_VIDEO_SETUP_HEIGHT); + goto out; + } + + + // Load up the bitmap font + file = dmf_open(engine.resources, "SetupFont.fnt"); + if (file == NULL) + file = dmf_create_memio(NULL, "SetupFont", engineSetupFont, sizeof(engineSetupFont)); + + result = dmLoadBitmapFont(file, &font); + dmf_close(file); + if (result != DMERR_OK) + { + dmError("Could not instantiate setup screen font, %d: %s\n", + result, dmErrorStr(result)); + goto out; + } + + menuBgBlit = dmGetScaledBlitFunc(menuBgImage, engine.screen->format, DMD_NONE); + + // Enter the main loop of the menu + while (!menuState) + { + while (SDL_PollEvent(&engine.event)) + switch (engine.event.type) + { + case SDL_KEYDOWN: + switch (engine.event.key.keysym.sym) + { + case SDLK_ESCAPE: + menuState = -1; + break; + + case SDLK_SPACE: + case SDLK_RETURN: + menuState = 1; + break; + + case SDLK_UP: + if (menuChoice > 0) + menuChoice--; + break; + + case SDLK_DOWN: + if (menuChoice < nmenuList - 1) + menuChoice++; + break; + + default: + break; + } + + break; + + case SDL_QUIT: + menuState = -1; + break; + } + + // Draw frame + if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) + { + dmError("Can't lock surface.\n"); + goto out; + } + + // Render the menu + dmClearSurface(engine.screen, dmMapRGB(engine.screen, 0,0,0)); + menuBgBlit(menuBgImage, 0, 0, engine.screen->w, engine.screen->h, engine.screen); + + + // Flip screen + if (SDL_MUSTLOCK(engine.screen) != 0) + SDL_UnlockSurface(engine.screen); + + SDL_Flip(engine.screen); + SDL_Delay(20); + } + +out: + return menuState; +} + + int main(int argc, char *argv[]) { int err; @@ -172,14 +304,13 @@ dmPrint(0, "Using libSDL, " +#ifdef DM_USE_PACKFS + "zlib, " +#endif #ifdef DM_USE_TREMOR "Tremor Vorbis codec" #endif -#ifdef DM_USE_PACKFS - ", zlib and modified stb_image.\n" -#else " and modified stb_image.\n" -#endif "See README.txt for more information.\n"); // Initialize resource subsystem @@ -199,6 +330,11 @@ } initSDL = TRUE; + + // Present video mode selector + if (engine.optVidSetup) + engineVideoSetup(); + // Initialize audio parts if (engine.optAfmt.freq == 0 && engine.optAfmt.channels == 0) { @@ -259,9 +395,6 @@ if (!engineInitializeVideo()) goto error_exit; - SDL_ShowCursor(SDL_DISABLE); - SDL_WM_SetCaption(dmProgDesc, dmProgName); - if (engine.demoInitPostVideo != NULL && (err = engine.demoInitPostVideo(&engine)) != DMERR_OK) { @@ -422,9 +555,6 @@ dmPrint(1, "Shutting down.\n"); SDL_ShowCursor(SDL_ENABLE); - if (engine.screen) - SDL_FreeSurface(engine.screen); - SDL_LockAudio(); SDL_PauseAudio(1); #ifdef DM_USE_JSS