#include "TextureMap.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include <cstdint> #include <iostream> TextureMap::TextureMap() : m_texture(nullptr) {} TextureMap::~TextureMap() { if (m_texture) { SDL_DestroyTexture(m_texture); } } //public bool TextureMap::loadFromFile(const std::string & path, SDL_Renderer * renderer) { assert(renderer != nullptr); assert(!path.empty()); std::int32_t x = 0; std::int32_t y = 0; std::int32_t c = 0; unsigned char * data = stbi_load(path.c_str(), &x, &y, &c, 0); if (data) { std::int32_t pitch = x * c; pitch = (pitch + 3) & ~3; constexpr std::int32_t rmask = 0x000000ff; constexpr std::int32_t gmask = 0x0000ff00; constexpr std::int32_t bmask = 0x00ff0000; const std::int32_t amask = c == 4 ? 0xff000000 : 0; auto * surface = SDL_CreateRGBSurfaceFrom(data, x, y, c * 8, pitch, rmask, gmask, bmask, amask); if (!surface) { std::cerr << "Unable to create texture surface: " << SDL_GetError() << "\n"; stbi_image_free(data); return false; } m_texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); stbi_image_free(data); if (!m_texture) { std::cerr << "Failed to create texture for " << path << "\n"; return false; } //sets alpha blending //SDL_SetTextureBlendMode(m_texture, SDL_BLENDMODE_BLEND); m_size.x = x; m_size.y = y; return true; } return false; }