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_;
-};