Mercurial > hg > dmlib
diff tools/ppl.c @ 1557:5e5f75b45f8d
Initial port to SDL2. Many things will not work now.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 13 May 2018 06:00:50 +0300 |
parents | 8f06c23e197d |
children | 43e18726e54d |
line wrap: on
line diff
--- a/tools/ppl.c Sun May 13 05:59:42 2018 +0300 +++ b/tools/ppl.c Sun May 13 06:00:50 2018 +0300 @@ -6,6 +6,7 @@ * Please read file 'COPYING' for information on license and distribution. */ #include "dmlib.h" +#include <SDL.h> #include "libgutil.h" #include "jss.h" @@ -23,6 +24,10 @@ struct { BOOL exitFlag; + + SDL_Window *window; + SDL_Renderer *renderer; + SDL_Texture *texture; SDL_Surface *screen; SDL_Event event; @@ -101,7 +106,7 @@ break; case 2: - engine.optVFlags |= SDL_FULLSCREEN; + engine.optVFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; break; case 3: @@ -189,15 +194,22 @@ BOOL dmInitializeVideo() { + SDL_DestroyTexture(engine.texture); SDL_FreeSurface(engine.screen); - engine.screen = SDL_SetVideoMode( - engine.optScrWidth, engine.optScrHeight, engine.optScrDepth, - engine.optVFlags | SDL_RESIZABLE | SDL_SWSURFACE | SDL_HWPALETTE); + if ((engine.texture = SDL_CreateTexture(engine.renderer, + SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, + engine.optScrWidth, engine.optScrHeight)) == NULL) + { + dmErrorMsg("Could not create SDL texture.\n"); + return FALSE; + } - if (engine.screen == NULL) + if ((engine.screen = SDL_CreateRGBSurface(0, + engine.optScrWidth, engine.optScrHeight, + 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff)) == NULL) { - dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); + dmErrorMsg("Could not create SDL surface.\n"); return FALSE; } @@ -677,13 +689,31 @@ muteState = TRUE; } - // Initialize video + // Open window + if ((engine.window = SDL_CreateWindow(dmProgName, + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + engine.optScrWidth, engine.optScrHeight, + engine.optVFlags | SDL_WINDOW_RESIZABLE + //| SDL_WINDOW_HIDDEN + )) == NULL) + { + dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError()); + goto error_exit; + } + + SDL_SetWindowTitle(engine.window, dmProgDesc); + + if ((engine.renderer = SDL_CreateRenderer(engine.window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL) + { + dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError()); + goto error_exit; + } + if (!dmInitializeVideo()) goto error_exit; - SDL_WM_SetCaption(dmProgDesc, dmProgName); - - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); +// SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); // okay, main loop here ... "play" module and print out info SDL_LockAudio(); @@ -694,7 +724,8 @@ while (!engine.exitFlag) { currTick = SDL_GetTicks(); - BOOL force = (currTick - prevTick > 500), updated = FALSE; + BOOL force = (currTick - prevTick > 500), + updated = FALSE; while (SDL_PollEvent(&engine.event)) switch (engine.event.type) @@ -764,8 +795,8 @@ break; case SDLK_f: - engine.optVFlags ^= SDL_FULLSCREEN; - if (!dmInitializeVideo()) + engine.optVFlags ^= SDL_WINDOW_FULLSCREEN_DESKTOP; + if (SDL_SetWindowFullscreen(engine.window, engine.optVFlags) != 0) goto error_exit; force = TRUE; break; @@ -776,16 +807,22 @@ break; - case SDL_VIDEORESIZE: - engine.optScrWidth = engine.event.resize.w; - engine.optScrHeight = engine.event.resize.h; + case SDL_WINDOWEVENT: + switch (engine.event.window.event) + { + case SDL_WINDOWEVENT_EXPOSED: + force = TRUE; + break; - if (!dmInitializeVideo()) - goto error_exit; + case SDL_WINDOWEVENT_RESIZED: + engine.optScrWidth = engine.event.window.data1; + engine.optScrHeight = engine.event.window.data2; + if (!dmInitializeVideo()) + goto error_exit; - break; - - case SDL_VIDEOEXPOSE: + force = TRUE; + break; + } break; case SDL_QUIT: @@ -809,12 +846,6 @@ } // Draw frame - if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) - { - dmErrorMsg("Can't lock surface.\n"); - goto error_exit; - } - if (force) { dmClearSurface(engine.screen, col.boxBg); @@ -856,18 +887,34 @@ #endif // Flip screen - if (SDL_MUSTLOCK(engine.screen) != 0) - SDL_UnlockSurface(engine.screen); + if (updated) + { + SDL_Surface dst; + SDL_LockTexture(engine.texture, NULL, &dst.pixels, &dst.pitch); - if (updated) - SDL_Flip(engine.screen); + for (int yc = 0; yc < engine.screen->h; yc++) + { + memcpy(dst.pixels + dst.pitch * yc, + engine.screen->pixels + engine.screen->pitch * yc, + dst.pitch); + } + + SDL_UnlockTexture(engine.texture); + + SDL_SetRenderDrawColor(engine.renderer, 0, 0, 0, 255); + SDL_RenderClear(engine.renderer); + SDL_RenderCopy(engine.renderer, engine.texture, NULL, NULL); + SDL_RenderPresent(engine.renderer); + } SDL_Delay(engine.pauseFlag ? 100 : 30); } error_exit: - if (engine.screen) - SDL_FreeSurface(engine.screen); + SDL_DestroyTexture(engine.texture); + SDL_DestroyRenderer(engine.renderer); + SDL_DestroyWindow(engine.window); + SDL_FreeSurface(engine.screen); dmMsg(0, "Audio shutdown.\n"); if (audioInit)