diff --git a/data/fosforo.gif b/data/fosforo.gif new file mode 100644 index 0000000..62a466c Binary files /dev/null and b/data/fosforo.gif differ diff --git a/data/gifs.txt b/data/gifs.txt index 3349884..8e446f8 100644 --- a/data/gifs.txt +++ b/data/gifs.txt @@ -9,6 +9,7 @@ end2.gif floor.gif font.gif font2.gif +fosforo.gif gat.gif gat2.gif intro1.gif diff --git a/source/jdraw.cpp b/source/jdraw.cpp index fd99d38..12ac807 100644 --- a/source/jdraw.cpp +++ b/source/jdraw.cpp @@ -15,11 +15,15 @@ namespace draw SDL_Renderer *sdl_renderer = nullptr; // El renderer de SDL SDL_Texture *sdl_texture = nullptr; // La textura de SDL a la que pintarem la nostra superficie "screen" i que despres volcarem a pantalla + SDL_Rect dest_rect = {0, 0, 320, 240}; + static int fullscreen_scale = 1; + static int screen_zoom = 1; static bool screen_fullscreen = false; static int screen_width = 320; static int screen_height = 240; std::string screen_title = ""; + static int screen_mode = SCREEN_MODE_NORMAL; surface *screen = nullptr; // La superficie screen, que representa la pantalla. Se crea i destrueix internament surface *destination = nullptr; // Punter a la actual superficie de destí @@ -89,8 +93,25 @@ namespace draw sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen_width, screen_height); + if (screen_fullscreen) + { + int w, h; + SDL_GetWindowSize(sdl_window, &w, &h); + fullscreen_scale = h/screen_height; + dest_rect.w = screen_width * fullscreen_scale; + dest_rect.h = screen_height * fullscreen_scale; + dest_rect.x = (w - dest_rect.w)/2; + dest_rect.y = (h - dest_rect.h)/2; + } + else + { + dest_rect.x = dest_rect.y = 0; + dest_rect.w = screen_width * zoom; + dest_rect.h = screen_height * zoom; + } + // Establim el tamany "logic", indepndent del tamany de finestra - SDL_RenderSetLogicalSize(sdl_renderer, width, height); + //SDL_RenderSetLogicalSize(sdl_renderer, width, height); // Creem la superficie "screen" i la establim com a superficie destinació screen = createSurface(width, height); @@ -152,8 +173,25 @@ namespace draw sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen_width, screen_height); + if (screen_fullscreen) + { + int w, h; + SDL_GetWindowSize(sdl_window, &w, &h); + fullscreen_scale = h/screen_height; + dest_rect.w = screen_width * fullscreen_scale; + dest_rect.h = screen_height * fullscreen_scale; + dest_rect.x = (w - dest_rect.w)/2; + dest_rect.y = (h - dest_rect.h)/2; + } + else + { + dest_rect.x = dest_rect.y = 0; + dest_rect.w = screen_width * zoom; + dest_rect.h = screen_height * zoom; + } + // Establim el tamany "logic", indepndent del tamany de finestra - SDL_RenderSetLogicalSize(sdl_renderer, screen_width, screen_height); + //SDL_RenderSetLogicalSize(sdl_renderer, screen_width, screen_height); } void setZoom(const int value) @@ -203,6 +241,23 @@ namespace draw return screen_zoom; } + void toggleScreenMode() + { + screen_mode++; + if (screen_mode == SCREEN_MODE_NUM_MODES) screen_mode = 0; + //reinit(); + } + + void setScreenMode(const int value) + { + screen_mode = value; + } + + const int getScreenMode() + { + return screen_mode; + } + // Crea una superficie i torna un punter a ella surface *createSurface(const uint16_t w, const uint16_t h) { @@ -629,9 +684,35 @@ namespace draw // Desbloquejem la textura SDL_UnlockTexture(sdl_texture); - // Pintem la textura a pantalla - SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); + if (screen_fullscreen) + { + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); + SDL_RenderClear(sdl_renderer); + } + // Pintem la textura a pantalla + SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, &dest_rect); + + if (screen_mode & SCREEN_MODE_SCANLINES) + { + if (screen_zoom>=3 || screen_fullscreen) + { + int zoom = screen_fullscreen ? fullscreen_scale : screen_zoom; + SDL_SetRenderDrawBlendMode(sdl_renderer, SDL_BLENDMODE_BLEND); + for (int y=0; y3) SDL_RenderDrawLine(sdl_renderer, dest_rect.x, 1+dest_rect.y + y*zoom, dest_rect.x + dest_rect.w, 1+dest_rect.y + y*zoom); + } + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 16); + for (int x=0; x