diff --git a/common/graphics/image.cpp b/common/graphics/image.cpp index bd9e662..f18e521 100644 --- a/common/graphics/image.cpp +++ b/common/graphics/image.cpp @@ -101,9 +101,10 @@ SDL_Texture* Image::Create(SDL_Renderer* renderer, Uint16 w, Uint16 h) { //make the texture texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, - SDL_TEXTUREACCESS_STATIC, + SDL_TEXTUREACCESS_TARGET, w, h); + //check if (!texture) { std::ostringstream msg; msg << "Failed to create a texture; " << SDL_GetError(); @@ -121,6 +122,31 @@ SDL_Texture* Image::Create(SDL_Renderer* renderer, Uint16 w, Uint16 h) { } local = true; + //blank (black) texture + SDL_SetRenderTarget(renderer, texture); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderFillRect(renderer, nullptr); + SDL_SetRenderTarget(renderer, nullptr); + + return texture; +} + +SDL_Texture* Image::CopyTexture(SDL_Renderer* renderer, SDL_Texture* ptr) { + Free(); + int w = 0, h = 0; + + //get the info + SDL_QueryTexture(ptr, nullptr, nullptr, &w, &h); + + //create a texture of (w, h) size (also sets the metadata) + Create(renderer, w, h); + + //copy the argument texture to the local texture + SDL_SetRenderTarget(renderer, texture); + SDL_RenderCopy(renderer, ptr, nullptr, nullptr); + SDL_SetRenderTarget(renderer, nullptr); + + //return the local texture return texture; } diff --git a/common/graphics/image.hpp b/common/graphics/image.hpp index f6685e4..09e7c33 100644 --- a/common/graphics/image.hpp +++ b/common/graphics/image.hpp @@ -40,6 +40,7 @@ public: SDL_Texture* Load(SDL_Renderer* renderer, std::string fname); SDL_Texture* Create(SDL_Renderer* renderer, Uint16 w, Uint16 h); + SDL_Texture* CopyTexture(SDL_Renderer* renderer, SDL_Texture* ptr); SDL_Texture* SetTexture(SDL_Texture*); SDL_Texture* GetTexture() const; virtual void Free(); diff --git a/common/ui/text_box.cpp b/common/ui/text_box.cpp new file mode 100644 index 0000000..4fdefa4 --- /dev/null +++ b/common/ui/text_box.cpp @@ -0,0 +1,56 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "text_box.hpp" + +#include + +TextBox::TextBox() { + // +} + +TextBox::~TextBox() { + // +} + +void TextBox::DrawTo(SDL_Renderer* renderer, int posX, int posY, int pointSize) { + for (std::list::iterator it = lineList.begin(); it != lineList.end(); it++) { + it->DrawTo(renderer, posX, posY); + posY -= pointSize; + } +} + +void TextBox::PushLine(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) { + lineList.emplace_front(renderer, font, str, color); +} + +void TextBox::PopLine(int num) { + //prevent underflow + num < lineList.size() ? num : lineList.size(); + + for (int i = 0; i < num; ++i) { + lineList.pop_back(); + } +} + +void TextBox::ClearLines() { + lineList.clear(); +} diff --git a/common/ui/text_box.hpp b/common/ui/text_box.hpp new file mode 100644 index 0000000..89d90a6 --- /dev/null +++ b/common/ui/text_box.hpp @@ -0,0 +1,45 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#pragma once + +#include "text_line.hpp" + +#include "SDL2/SDL.h" +#include "SDL2/SDL_ttf.h" + +#include +#include + +class TextBox { +public: + TextBox(); + ~TextBox(); + + void DrawTo(SDL_Renderer*, int posX, int posY, int pointSize); + + void PushLine(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color); + void PopLine(int num = 1); + void ClearLines(); + +private: + std::list lineList; +}; \ No newline at end of file diff --git a/common/ui/text_line.cpp b/common/ui/text_line.cpp new file mode 100644 index 0000000..8826e86 --- /dev/null +++ b/common/ui/text_line.cpp @@ -0,0 +1,70 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "text_line.hpp" + +#include + +SDL_Texture* renderTextTexture(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) { + //make the surface (from SDL_ttf) + SDL_Surface* surface = TTF_RenderText_Solid(font, str.c_str(), color); + if (!surface) { + throw(std::runtime_error("Failed to create a TTF surface")); + } + + //convert to texture + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + + //cleanup + SDL_FreeSurface(surface); + + //check + if (!texture) { + throw(std::runtime_error("Failed to create a TTF texture")); + } + + //NOTE: free the texture yourself + return texture; +} + +TextLine::TextLine() { + // +} + +TextLine::~TextLine() { + ClearText(); +} + +void TextLine::DrawTo(SDL_Renderer* renderer, int posX, int posY) { + SDL_Rect dclip = {posX, posY, 0, 0}; + SDL_QueryTexture(texture, nullptr, nullptr, &dclip.w, &dclip.h); + SDL_RenderCopy(renderer, texture, nullptr, &dclip); +} + +void TextLine::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) { + //just use the above global function + SDL_DestroyTexture(texture); + texture = renderTextTexture(renderer, font, str, color); +} + +void TextLine::ClearText() { + SDL_DestroyTexture(texture); +} \ No newline at end of file diff --git a/common/ui/text_line.hpp b/common/ui/text_line.hpp new file mode 100644 index 0000000..4a2595a --- /dev/null +++ b/common/ui/text_line.hpp @@ -0,0 +1,45 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#pragma once + +#include "SDL2/SDL.h" +#include "SDL2/SDL_ttf.h" + +#include + +SDL_Texture* renderTextTexture(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color); + +class TextLine { +public: + TextLine(); + TextLine(SDL_Renderer* r, TTF_Font* f, std::string s, SDL_Color c) + { SetText(r, f, s, c); } + ~TextLine(); + + void DrawTo(SDL_Renderer*, int posX, int posY); + + void SetText(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color); + void ClearText(); + +protected: + SDL_Texture* texture = nullptr; +}; \ No newline at end of file