#include "KTexture.h" #include #include namespace KapitanGame { KTexture::KTexture() : Texture(nullptr), Width(0), Height(0) { } KTexture::KTexture(KTexture&& other) noexcept : Texture(other.Texture), Width(other.Width), Height(other.Height) { other.Texture = nullptr; other.Width = 0; other.Height = 0; } KTexture& KTexture::operator=(KTexture&& other) noexcept { if (this == &other) return *this; Free(); Texture = other.Texture; Width = other.Width; Height = other.Height; other.Texture = nullptr; other.Width = 0; other.Height = 0; return *this; } KTexture::~KTexture() { //Deallocate Free(); } bool KTexture::LoadFromFile(const std::string& path, SDL_Renderer* renderer) { //Get rid of preexisting texture Free(); //The final texture SDL_Texture* newTexture = nullptr; //Load image at specified path SDL_Surface* loadedSurface = IMG_Load(path.c_str()); if (loadedSurface == nullptr) { printf("Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError()); } else { //Color key image SDL_SetColorKey(loadedSurface, SDL_TRUE, SDL_MapRGB(loadedSurface->format, 0xFF, 0, 0xFF)); //Create texture from surface pixels newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface); if (newTexture == nullptr) { printf("Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError()); } else { //Get image dimensions Width = loadedSurface->w; Height = loadedSurface->h; } //Get rid of old loaded surface SDL_FreeSurface(loadedSurface); } //Return success Texture = newTexture; return Texture != nullptr; } bool KTexture::LoadFromSurface(SDL_Surface* surface, SDL_Renderer* renderer) { Free(); Texture = SDL_CreateTextureFromSurface(renderer, surface); if (Texture == nullptr) { printf("Unable to create texture from surface! SDL Error: %s\n", SDL_GetError()); } else { Width = surface->w; Height = surface->h; } return Texture != nullptr; } void KTexture::Free() { //Free texture if it exists if (Texture != nullptr) { SDL_DestroyTexture(Texture); Texture = nullptr; Width = 0; Height = 0; } } void KTexture::Render(SDL_Renderer* renderer, const float x, const float y, SDL_Rect* clip, const float scale) const { if (Texture == nullptr) return; //Set rendering space and render to screen SDL_FRect renderQuad = { x * scale, y * scale, static_cast(Width) * scale, static_cast(Height) * scale }; //Set clip rendering dimensions if (clip != nullptr) { renderQuad.w = clip->w; renderQuad.h = clip->h; } //Render to screen SDL_RenderCopyF(renderer, Texture, clip, &renderQuad); } void KTexture::RenderEx(SDL_Renderer* renderer, const float x, const float y, const double degrees, SDL_Rect* clip, const float scale, const SDL_RendererFlip flip) const { if (Texture == nullptr) return; //Set rendering space and render to screen SDL_FRect renderQuad = { x * scale, y * scale, static_cast(Width) * scale, static_cast(Height) * scale }; //Set clip rendering dimensions if (clip != nullptr) { renderQuad.w = clip->w; renderQuad.h = clip->h; } //Render to screen SDL_RenderCopyExF(renderer, Texture, clip, &renderQuad, degrees, nullptr, flip); } int KTexture::GetWidth() const { return Width; } int KTexture::GetHeight() const { return Height; } }