diff options
Diffstat (limited to 'window.cpp')
-rw-r--r-- | window.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/window.cpp b/window.cpp new file mode 100644 index 0000000..3813a3c --- /dev/null +++ b/window.cpp @@ -0,0 +1,72 @@ +#include "window.hpp" + +#include <cstdlib> +#include <iostream> + +#include <SDL2/SDL_image.h> + +SDL_Window *window; +SDL_Renderer *renderer; + +int sdl2Initialize() +{ + if (auto err = SDL_Init(SDL_INIT_VIDEO); err < 0) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit(SDL_Quit); + } + + if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { + std::cerr << "IMG error: " << IMG_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit(IMG_Quit); + } + + window = SDL_CreateWindow("game", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + WINDOW_WIDTH, WINDOW_HEIGHT, + SDL_WINDOW_SHOWN); + + if (window == nullptr) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit([] { SDL_DestroyWindow(window); }); + } + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + if (renderer == nullptr) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit([] { SDL_DestroyRenderer(renderer); }); + } + + return 0; +} + +SDL_Texture *sdl2LoadTexture(const char *path) +{ + SDL_Texture *tex = nullptr; + + auto surface = IMG_Load(path); + if (surface == nullptr) { + std::cerr << "Unable to load image " << path << '!' << std::endl; + std::cerr << "SDL error: " << IMG_GetError() << std::endl; + } else { + tex = SDL_CreateTextureFromSurface(renderer, surface); + + if (tex == nullptr) { + std::cerr << "Unable to create texture for " << path << '!' << std::endl; + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + } else { + SDL_FreeSurface(surface); + } + } + + return tex; +} + |