diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index fa9a78b1599b..9a706161f859 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -990,6 +990,7 @@ + diff --git a/src/gui/core/canvas.cpp b/src/gui/core/canvas.cpp index 9573c7b20f5b..de9d5610a08a 100644 --- a/src/gui/core/canvas.cpp +++ b/src/gui/core/canvas.cpp @@ -31,6 +31,7 @@ #include "gui/core/log.hpp" #include "gui/widgets/helper.hpp" #include "sdl/rect.hpp" +#include "sdl/render_utils.hpp" #include "video.hpp" #include "wml_exception.hpp" diff --git a/src/sdl/render_utils.hpp b/src/sdl/render_utils.hpp new file mode 100644 index 000000000000..1214d2daeb3a --- /dev/null +++ b/src/sdl/render_utils.hpp @@ -0,0 +1,103 @@ +/* + Copyright (C) 2017 the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#pragma once + +#include "sdl/texture.hpp" +#include "video.hpp" + +#include +#include + +#include + +/** + * Sets the renderer output target to the specified texture. + * @todo: add support for restoring last target. + */ +class render_target_setter +{ +public: + explicit render_target_setter(texture& t) + : renderer_(CVideo::get_singleton().get_renderer()) + { + if(renderer_) { + // Validate we can render to this texture. + assert(t.get_info().access == SDL_TEXTUREACCESS_TARGET); + + SDL_SetRenderTarget(renderer_, t); + } + } + + ~render_target_setter() + { + if(renderer_) { + SDL_SetRenderTarget(renderer_, nullptr); + } + } + +private: + SDL_Renderer* renderer_; +}; + +using sdl_rect_getter = void (*)(SDL_Renderer*, SDL_Rect*); +using sdl_rect_setter = int (*)(SDL_Renderer*, const SDL_Rect*); + +/** + * Base class for renderer RAII helpers that operate on SDL_Rects. + * + * @tparam G Getter function. Will fetch the current applicable rect. + * That will be restored as the applicable state once this object is destroyed. + * @tparam S Setter function. + */ +template +class render_raii_rect_setter_base +{ +public: + explicit render_raii_rect_setter_base(SDL_Rect* rect) + : operate_(rect != nullptr) + , last_rect_() + , renderer_(CVideo::get_singleton().get_renderer()) + { + if(renderer_ && operate_) { + (*G)(renderer_, &last_rect_); + (*S)(renderer_, rect); + } + } + + ~render_raii_rect_setter_base() + { + if(renderer_ && operate_) { + (*S)(renderer_, &last_rect_); + } + } + +private: + const bool operate_; + SDL_Rect last_rect_; + SDL_Renderer* renderer_; +}; + +/** + * Sets the renderer clip rect. + */ +using render_clip_rect_setter = render_raii_rect_setter_base< + &SDL_RenderGetClipRect, + &SDL_RenderSetClipRect>; + +/** + * Sets the renderer viewport rect. + */ +using render_viewport_setter = render_raii_rect_setter_base< + &SDL_RenderGetViewport, + &SDL_RenderSetViewport>; diff --git a/src/sdl/texture.cpp b/src/sdl/texture.cpp index d5e380a2456d..f43e7b7a608b 100644 --- a/src/sdl/texture.cpp +++ b/src/sdl/texture.cpp @@ -17,9 +17,6 @@ #include "sdl/surface.hpp" #include "video.hpp" -#include -#include - static lg::log_domain log_sdl("SDL"); #define ERR_SDL LOG_STREAM(err, log_sdl) @@ -112,21 +109,3 @@ texture::info::info(const texture& t) { SDL_QueryTexture(t, &format, &access, &w, &h); } - -render_target_setter::render_target_setter(texture& t) - : renderer_(CVideo::get_singleton().get_renderer()) -{ - if(renderer_) { - // Validate we can render to this texture. - assert(t.get_info().access == SDL_TEXTUREACCESS_TARGET); - - SDL_SetRenderTarget(renderer_, t); - } -} - -render_target_setter::~render_target_setter() -{ - if(renderer_) { - SDL_SetRenderTarget(renderer_, nullptr); - } -} diff --git a/src/sdl/texture.hpp b/src/sdl/texture.hpp index ea1e64573e48..9fccea80f503 100644 --- a/src/sdl/texture.hpp +++ b/src/sdl/texture.hpp @@ -80,17 +80,3 @@ class texture SDL_Texture* texture_; }; - -/** - * Small RAII helper class to temporarily set the renderer target to a texture. - */ -class render_target_setter -{ -public: - explicit render_target_setter(texture& t); - - ~render_target_setter(); - -private: - SDL_Renderer* renderer_; -};