Mercurial > hg > dmlib
diff tools/64vw.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 | e68d3b16c79e |
children | 58aa34bb4f03 |
line wrap: on
line diff
--- a/tools/64vw.c Sun May 13 05:59:42 2018 +0300 +++ b/tools/64vw.c Sun May 13 06:00:50 2018 +0300 @@ -12,7 +12,7 @@ #include <SDL.h> -int optVFlags = SDL_SWSURFACE | SDL_HWPALETTE; +int optVFlags = 0; int optScrWidth, optScrHeight; int optForcedFormat = -1; BOOL optProbeOnly = FALSE; @@ -72,7 +72,7 @@ break; case 2: - optVFlags |= SDL_FULLSCREEN; + optVFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; break; case 3: @@ -152,18 +152,6 @@ } -BOOL dmInitializeVideo(SDL_Surface **screen) -{ - *screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 8, optVFlags | SDL_RESIZABLE); - if (*screen == NULL) - { - dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); - return FALSE; - } - return TRUE; -} - - int dmReadC64Image(const char *filename, const DMC64ImageFormat *forced, const DMC64ImageFormat **fmt, DMC64Image **cimage) { Uint8 *dataBuf = NULL; @@ -203,7 +191,10 @@ int main(int argc, char *argv[]) { - SDL_Surface *screen = NULL, *surf = NULL; + SDL_Window *window = NULL; + SDL_Renderer *renderer = NULL; + SDL_Texture *texture = NULL; + SDL_Surface *surf = NULL; BOOL initSDL = FALSE, exitFlag, needRedraw; const DMC64ImageFormat *forced; size_t currIndex, prevIndex; @@ -279,15 +270,26 @@ } initSDL = TRUE; - - // Open window/set video mode - screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 8, optVFlags | SDL_RESIZABLE); - if (screen == NULL) + // Open window + if ((window = SDL_CreateWindow(dmProgName, + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + optScrWidth, optScrHeight, + optVFlags | SDL_WINDOW_RESIZABLE + //| SDL_WINDOW_HIDDEN + )) == NULL) { - dmErrorMsg("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); + dmErrorMsg("Can't create an SDL window: %s\n", SDL_GetError()); goto exit; } + if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC)) == NULL) + { + dmErrorMsg("Can't create an SDL renderer: %s\n", SDL_GetError()); + goto exit; + } + +// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); + // Start main loop currIndex = 0; prevIndex = 1; @@ -342,17 +344,20 @@ needRedraw = TRUE; break; - case SDL_VIDEORESIZE: - optScrWidth = event.resize.w; - optScrHeight = event.resize.h; - if (!dmInitializeVideo(&screen)) - goto exit; + case SDL_WINDOWEVENT: + switch (event.window.event) + { + case SDL_WINDOWEVENT_EXPOSED: + needRedraw = TRUE; + break; - needRedraw = TRUE; - break; + case SDL_WINDOWEVENT_RESIZED: + optScrWidth = event.window.data1; + optScrHeight = event.window.data2; - case SDL_VIDEOEXPOSE: - needRedraw = TRUE; + needRedraw = TRUE; + break; + } break; case SDL_QUIT: @@ -415,6 +420,17 @@ goto exit; } + SDL_SetPaletteColors(surf->format->palette, (SDL_Color *)dmDefaultC64Palette, 0, C64_NCOLORS); + + if (texture != NULL) + SDL_DestroyTexture(texture); + + if ((texture = SDL_CreateTextureFromSurface(renderer, surf)) == NULL) + { + dmErrorMsg("Could not create texture from surface: %s\n", SDL_GetError()); + goto exit; + } + if (title == NULL) { title = dm_strdup_printf("%s - %s [%d / %d]", @@ -422,7 +438,7 @@ currIndex + 1, noptFilenames2); } - SDL_WM_SetCaption(title, dmProgName); + SDL_SetWindowTitle(window, title); dmFree(title); needRedraw = TRUE; @@ -431,23 +447,10 @@ if (needRedraw) { - float aspect = (float) surf->h / (float) surf->w; - int sheight = optScrHeight / aspect; - int ypos = (optScrHeight - sheight) / 2; - - if (SDL_MUSTLOCK(screen) != 0 && SDL_LockSurface(screen) != 0) - { - dmErrorMsg("Can't lock surface.\n"); - goto exit; - } - - dmScaledBlitSurface8to8(surf, 0, ypos, optScrWidth, sheight, screen); - SDL_SetColors(screen, (SDL_Color *)dmDefaultC64Palette, 0, C64_NCOLORS); - - if (SDL_MUSTLOCK(screen) != 0) - SDL_UnlockSurface(screen); - - SDL_Flip(screen); + //SDL_RenderSetLogicalSize(renderer, surf->w, surf->h); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); needRedraw = FALSE; } @@ -458,8 +461,11 @@ // Cleanup dmFree(optFilenames); - if (screen != NULL) - SDL_FreeSurface(screen); + if (window != NULL) + SDL_DestroyWindow(window); + + if (texture != NULL) + SDL_DestroyTexture(texture); if (surf != NULL) SDL_FreeSurface(surf);