aboutsummaryrefslogtreecommitdiffstats
path: root/window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'window.cpp')
-rw-r--r--window.cpp72
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;
+}
+