From 29f929794c7519b049de0be3af635f05d7e83be6 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sat, 15 Feb 2014 20:31:52 +0300
Subject: move some methods from base/graphics into render/graphics.

Remove base/graphcs.
---
 src/CMakeLists.txt                         |   2 -
 src/Makefile.am                            |   3 -
 src/being/being.cpp                        |   8 +-
 src/gui/base/basiccontainer.cpp            |   3 +-
 src/gui/base/font.hpp                      |   4 +-
 src/gui/base/graphics.cpp                  | 179 ------------------
 src/gui/base/graphics.hpp                  | 294 -----------------------------
 src/gui/base/gui.cpp                       |   3 +-
 src/gui/base/gui.hpp                       |   3 +-
 src/gui/base/widget.cpp                    |   3 +-
 src/gui/base/widget.hpp                    |   3 +-
 src/gui/base/widgets/button.cpp            |   3 +-
 src/gui/base/widgets/button.hpp            |   3 +-
 src/gui/base/widgets/checkbox.cpp          |   3 +-
 src/gui/base/widgets/container.cpp         |   3 +-
 src/gui/base/widgets/container.hpp         |   3 +-
 src/gui/base/widgets/label.cpp             |   3 +-
 src/gui/base/widgets/label.hpp             |   3 +-
 src/gui/base/widgets/listbox.cpp           |   3 +-
 src/gui/base/widgets/radiobutton.cpp       |   3 +-
 src/gui/base/widgets/scrollarea.cpp        |   3 +-
 src/gui/base/widgets/slider.cpp            |   3 +-
 src/gui/base/widgets/textbox.cpp           |   3 +-
 src/gui/base/widgets/textfield.cpp         |   3 +-
 src/gui/base/widgets/window.cpp            |   3 +-
 src/gui/sdlfont.cpp                        |   2 +-
 src/gui/sdlfont.h                          |   2 +-
 src/gui/viewport.cpp                       |  10 +-
 src/gui/viewport.h                         |   2 +-
 src/gui/widgets/avatarlistbox.cpp          |   2 +-
 src/gui/widgets/avatarlistbox.h            |   2 +-
 src/gui/widgets/browserbox.cpp             |  13 +-
 src/gui/widgets/browserbox.h               |   2 +-
 src/gui/widgets/button.cpp                 |   8 +-
 src/gui/widgets/button.h                   |   2 +-
 src/gui/widgets/checkbox.cpp               |   4 +-
 src/gui/widgets/checkbox.h                 |   4 +-
 src/gui/widgets/colorpage.cpp              |   2 +-
 src/gui/widgets/colorpage.h                |   2 +-
 src/gui/widgets/desktop.cpp                |   2 +-
 src/gui/widgets/desktop.h                  |   2 +-
 src/gui/widgets/dropdown.cpp               |   6 +-
 src/gui/widgets/dropdown.h                 |   6 +-
 src/gui/widgets/dropshortcutcontainer.cpp  |   2 +-
 src/gui/widgets/dropshortcutcontainer.h    |   2 +-
 src/gui/widgets/emotepage.cpp              |   2 +-
 src/gui/widgets/emotepage.h                |   2 +-
 src/gui/widgets/emoteshortcutcontainer.cpp |   2 +-
 src/gui/widgets/emoteshortcutcontainer.h   |   2 +-
 src/gui/widgets/extendedlistbox.cpp        |   5 +-
 src/gui/widgets/extendedlistbox.h          |   2 +-
 src/gui/widgets/guitable.cpp               |   5 +-
 src/gui/widgets/guitable.h                 |   2 +-
 src/gui/widgets/icon.cpp                   |   2 +-
 src/gui/widgets/icon.h                     |   2 +-
 src/gui/widgets/itemcontainer.cpp          |   2 +-
 src/gui/widgets/itemcontainer.h            |   2 +-
 src/gui/widgets/itemshortcutcontainer.cpp  |   2 +-
 src/gui/widgets/itemshortcutcontainer.h    |   2 +-
 src/gui/widgets/label.cpp                  |   2 +-
 src/gui/widgets/label.h                    |   2 +-
 src/gui/widgets/listbox.cpp                |   5 +-
 src/gui/widgets/listbox.h                  |   2 +-
 src/gui/widgets/passwordfield.cpp          |   2 +-
 src/gui/widgets/passwordfield.h            |   2 +-
 src/gui/widgets/playerbox.cpp              |   4 +-
 src/gui/widgets/playerbox.h                |   4 +-
 src/gui/widgets/popup.cpp                  |   2 +-
 src/gui/widgets/popup.h                    |   2 +-
 src/gui/widgets/progressbar.cpp            |   2 +-
 src/gui/widgets/progressbar.h              |   2 +-
 src/gui/widgets/progressindicator.cpp      |   2 +-
 src/gui/widgets/progressindicator.h        |   2 +-
 src/gui/widgets/radiobutton.cpp            |   4 +-
 src/gui/widgets/radiobutton.h              |   4 +-
 src/gui/widgets/scrollarea.cpp             |  26 +--
 src/gui/widgets/scrollarea.h               |  26 +--
 src/gui/widgets/shoplistbox.cpp            |   2 +-
 src/gui/widgets/shoplistbox.h              |   2 +-
 src/gui/widgets/shortcutcontainer.h        |   2 +-
 src/gui/widgets/slider.cpp                 |   2 +-
 src/gui/widgets/slider.h                   |   2 +-
 src/gui/widgets/sliderlist.cpp             |   2 +-
 src/gui/widgets/sliderlist.h               |   2 +-
 src/gui/widgets/spellshortcutcontainer.cpp |   2 +-
 src/gui/widgets/spellshortcutcontainer.h   |   2 +-
 src/gui/widgets/tabbedarea.cpp             |   2 +-
 src/gui/widgets/tabbedarea.h               |   2 +-
 src/gui/widgets/tabs/tab.cpp               |   2 +-
 src/gui/widgets/tabs/tab.h                 |   2 +-
 src/gui/widgets/textbox.cpp                |   2 +-
 src/gui/widgets/textbox.h                  |   2 +-
 src/gui/widgets/textfield.cpp              |  12 +-
 src/gui/widgets/textfield.h                |   6 +-
 src/gui/widgets/textpreview.cpp            |   2 +-
 src/gui/widgets/textpreview.h              |   2 +-
 src/gui/widgets/window.cpp                 |  12 +-
 src/gui/widgets/window.h                   |   4 +-
 src/gui/widgets/windowcontainer.cpp        |   2 +-
 src/gui/widgets/windowcontainer.h          |   2 +-
 src/gui/windowmenu.cpp                     |   2 +-
 src/gui/windowmenu.h                       |   2 +-
 src/gui/windows/buydialog.cpp              |   2 +-
 src/gui/windows/chatwindow.cpp             |   2 +-
 src/gui/windows/chatwindow.h               |   2 +-
 src/gui/windows/connectiondialog.cpp       |   2 +-
 src/gui/windows/connectiondialog.h         |   2 +-
 src/gui/windows/debugwindow.cpp            |   2 +-
 src/gui/windows/debugwindow.h              |   2 +-
 src/gui/windows/equipmentwindow.cpp        |   2 +-
 src/gui/windows/equipmentwindow.h          |   2 +-
 src/gui/windows/minimap.cpp                |   2 +-
 src/gui/windows/minimap.h                  |   2 +-
 src/gui/windows/ministatuswindow.cpp       |   2 +-
 src/gui/windows/ministatuswindow.h         |   2 +-
 src/gui/windows/outfitwindow.cpp           |   6 +-
 src/gui/windows/outfitwindow.h             |   2 +-
 src/gui/windows/selldialog.cpp             |   2 +-
 src/gui/windows/serverdialog.cpp           |   2 +-
 src/gui/windows/skilldialog.cpp            |   2 +-
 src/render/graphics.cpp                    | 124 +++++++++++-
 src/render/graphics.h                      | 163 ++++++++++++++--
 src/render/mobileopenglgraphics.cpp        |   4 +-
 src/render/normalopenglgraphics.cpp        |   4 +-
 src/render/nullopenglgraphics.cpp          |   4 +-
 src/render/safeopenglgraphics.cpp          |   4 +-
 src/render/sdl2graphics.cpp                |  47 ++++-
 src/render/sdl2graphics.h                  |  43 +++++
 src/render/sdl2softwaregraphics.cpp        |   4 +-
 src/render/sdlgraphics.cpp                 |   4 +-
 src/text.cpp                               |  10 +-
 src/text.h                                 |   9 +-
 132 files changed, 589 insertions(+), 700 deletions(-)
 delete mode 100644 src/gui/base/graphics.cpp
 delete mode 100644 src/gui/base/graphics.hpp

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 79280485c..65570ee7b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -780,7 +780,6 @@ SET(SRCS
     gui/base/focushandler.hpp
     gui/base/focuslistener.hpp
     gui/base/font.hpp
-    gui/base/graphics.hpp
     gui/base/gui.hpp
     gui/base/input.hpp
     gui/base/inputevent.hpp
@@ -817,7 +816,6 @@ SET(SRCS
     gui/base/exception.cpp
     gui/base/focushandler.cpp
     gui/base/font.cpp
-    gui/base/graphics.cpp
     gui/base/gui.cpp
     gui/base/inputevent.cpp
     gui/base/key.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 028041582..7fe7a5e2e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,7 +32,6 @@ dyecmd_SOURCES = gui/base/actionevent.cpp \
 	      gui/base/event.cpp \
 	      gui/base/exception.cpp \
 	      gui/base/font.cpp \
-	      gui/base/graphics.cpp \
 	      gui/base/rectangle.cpp \
 	      gui/base/widget.cpp \
 	      gui/base/actionevent.hpp \
@@ -41,7 +40,6 @@ dyecmd_SOURCES = gui/base/actionevent.cpp \
 	      gui/base/event.hpp \
 	      gui/base/exception.hpp \
 	      gui/base/font.hpp \
-	      gui/base/graphics.hpp \
 	      gui/base/rectangle.hpp \
 	      gui/base/widget.hpp
 
@@ -206,7 +204,6 @@ manaplus_SOURCES += gui/base/actionevent.hpp \
 	      gui/base/exception.cpp \
 	      gui/base/focushandler.cpp \
 	      gui/base/font.cpp \
-	      gui/base/graphics.cpp \
 	      gui/base/gui.cpp \
 	      gui/base/inputevent.cpp \
 	      gui/base/key.cpp \
diff --git a/src/being/being.cpp b/src/being/being.cpp
index dfb335f9b..8b2ece2b7 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -519,7 +519,7 @@ void Being::setSpeech(const std::string &text, const std::string &channel,
 
         mText = new Text(mSpeech,
                          getPixelX(), getPixelY() - getHeight(),
-                         gcn::Graphics::CENTER,
+                         Graphics::CENTER,
                          &userPalette->getColor(UserPalette::PARTICLE),
                          true);
     }
@@ -1856,7 +1856,7 @@ void Being::drawSpeech(const int offsetX, const int offsetY)
         if (!mText && userPalette)
         {
             mText = new Text(mSpeech, getPixelX(), getPixelY() - getHeight(),
-                gcn::Graphics::CENTER, &Theme::getThemeColor(
+                Graphics::CENTER, &Theme::getThemeColor(
                 Theme::BUBBLE_TEXT), true);
         }
     }
@@ -2019,12 +2019,12 @@ void Being::showName()
         mDispName = new FlashText(displayName,
             getPixelX() + mInfo->getNameOffsetX(),
             getPixelY() + mInfo->getNameOffsetY(),
-            gcn::Graphics::CENTER, mNameColor, font);
+            Graphics::CENTER, mNameColor, font);
     }
     else
     {
         mDispName = new FlashText(displayName, getPixelX(), getPixelY(),
-            gcn::Graphics::CENTER, mNameColor, font);
+            Graphics::CENTER, mNameColor, font);
     }
 
     updateCoords();
diff --git a/src/gui/base/basiccontainer.cpp b/src/gui/base/basiccontainer.cpp
index 45bb1e231..7a937fb42 100644
--- a/src/gui/base/basiccontainer.cpp
+++ b/src/gui/base/basiccontainer.cpp
@@ -71,9 +71,10 @@
 
 #include "gui/base/exception.hpp"
 #include "gui/base/focushandler.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/font.hpp b/src/gui/base/font.hpp
index 8e8ad18c9..075af4136 100644
--- a/src/gui/base/font.hpp
+++ b/src/gui/base/font.hpp
@@ -68,10 +68,10 @@
 
 #include "localconsts.h"
 
+class Graphics;
+
 namespace gcn
 {
-    class Graphics;
-
     /**
      * Interface for a font.
      *
diff --git a/src/gui/base/graphics.cpp b/src/gui/base/graphics.cpp
deleted file mode 100644
index fd76a1e6f..000000000
--- a/src/gui/base/graphics.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  The ManaPlus Client
- *  Copyright (C) 2011-2014  The ManaPlus Developers
- *
- *  This file is part of The ManaPlus Client.
- *
- *  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
- *  any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*      _______   __   __   __   ______   __   __   _______   __   __
- *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
- *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
- *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
- *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
- * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
- * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
- *
- * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
- *
- *
- * Per Larsson a.k.a finalman
- * Olof Naessén a.k.a jansem/yakslem
- *
- * Visit: http://guichan.sourceforge.net
- *
- * License: (BSD)
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- * 3. Neither the name of Guichan nor the names of its contributors may
- *    be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * For comments regarding functions please see the header file.
- */
-
-#include "gui/base/graphics.hpp"
-
-#include "gui/base/exception.hpp"
-#include "gui/base/font.hpp"
-#include "resources/image.h"
-
-#include "debug.h"
-
-namespace gcn
-{
-
-    Graphics::Graphics() :
-        mClipStack(),
-        mFont(nullptr)
-    {
-    }
-
-    bool Graphics::pushClipArea(Rectangle area)
-    {
-        // Ignore area with a negate width or height
-        // by simple pushing an empty clip area
-        // to the stack.
-        if (area.width < 0 || area.height < 0)
-        {
-            ClipRectangle carea;
-            mClipStack.push(carea);
-            return true;
-        }
-
-        if (mClipStack.empty())
-        {
-            ClipRectangle carea;
-            carea.x = area.x;
-            carea.y = area.y;
-            carea.width = area.width;
-            carea.height = area.height;
-            carea.xOffset = area.x;
-            carea.yOffset = area.y;
-            mClipStack.push(carea);
-            return true;
-        }
-
-        const ClipRectangle &top = mClipStack.top();
-        ClipRectangle carea;
-        carea = area;
-        carea.xOffset = top.xOffset + carea.x;
-        carea.yOffset = top.yOffset + carea.y;
-        carea.x += top.xOffset;
-        carea.y += top.yOffset;
-
-        // Clamp the pushed clip rectangle.
-        if (carea.x < top.x)
-            carea.x = top.x;
-
-        if (carea.y < top.y)
-            carea.y = top.y;
-
-        if (carea.x + carea.width > top.x + top.width)
-        {
-            carea.width = top.x + top.width - carea.x;
-
-            if (carea.width < 0)
-                carea.width = 0;
-        }
-
-        if (carea.y + carea.height > top.y + top.height)
-        {
-            carea.height = top.y + top.height - carea.y;
-
-            if (carea.height < 0)
-                carea.height = 0;
-        }
-
-        const bool result = carea.isIntersecting(top);
-
-        mClipStack.push(carea);
-
-        return result;
-    }
-
-    void Graphics::popClipArea()
-    {
-        if (mClipStack.empty())
-            throw GCN_EXCEPTION("Tried to pop clip area from empty stack.");
-
-        mClipStack.pop();
-    }
-
-    const ClipRectangle& Graphics::getCurrentClipArea()
-    {
-        if (mClipStack.empty())
-            throw GCN_EXCEPTION("The clip area stack is empty.");
-
-        return mClipStack.top();
-    }
-
-    void Graphics::drawImage(const Image* image A_UNUSED,
-                             int dstX A_UNUSED, int dstY A_UNUSED)
-    {
-    }
-
-/*
-    void Graphics::setFont(Font* font)
-    {
-    }
-
-    void Graphics::drawText(const std::string& text, int x, int y,
-                            Alignment alignment)
-    {
-    }
-*/
-}  // namespace gcn
diff --git a/src/gui/base/graphics.hpp b/src/gui/base/graphics.hpp
deleted file mode 100644
index d3128c8ae..000000000
--- a/src/gui/base/graphics.hpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- *  The ManaPlus Client
- *  Copyright (C) 2011-2014  The ManaPlus Developers
- *
- *  This file is part of The ManaPlus Client.
- *
- *  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
- *  any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*      _______   __   __   __   ______   __   __   _______   __   __
- *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
- *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
- *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
- *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
- * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
- * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
- *
- * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
- *
- *
- * Per Larsson a.k.a finalman
- * Olof Naessén a.k.a jansem/yakslem
- *
- * Visit: http://guichan.sourceforge.net
- *
- * License: (BSD)
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- * 3. Neither the name of Guichan nor the names of its contributors may
- *    be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef GCN_GRAPHICS_HPP
-#define GCN_GRAPHICS_HPP
-
-#include <iosfwd>
-#include <stack>
-
-#include "gui/base/cliprectangle.hpp"
-
-namespace gcn
-{
-    class Color;
-    class Font;
-    class Image;
-
-    /**
-     * Abstract class for providing drawing primitve functions. 
-     * It contains all vital functions for drawing.
-     *
-     * Guichan contains implementations of Graphics for common 
-     * libraries like the Allegro library, the HGE library, 
-     * the OpenGL library, the OpenLayer library, and the SDL library. 
-     * To make Guichan usable with other libraries, a Graphics class
-     * must be implemented.
-     *
-     * In Graphics you can set clip areas to limit drawing to certain
-     * areas of the screen. Clip areas are put on a stack, which 
-     * means that you can push smaller and smaller clip areas onto the 
-     * stack. All coordinates will be relative to the top most clip area. 
-     * In most cases you won't have to worry about the clip areas, 
-     * unless you want to implement some really complex widget. 
-     * Pushing and poping of clip areas are handled automatically by 
-     * container widgets when their child widgets are drawn.
-     *
-     * IMPORTANT: Remember to pop each clip area that you pushed on the stack
-     * after you are done with it.
-     *
-     * If you feel that Graphics is to restrictive for your needs, 
-     * there is no one stopping you from using your own code for drawing 
-     * in widgets. You could for instance use pure SDL in the drawing of 
-     * widgets bypassing Graphics. This might however hurt portability of 
-     * your application.
-     *
-     * If you implement a Graphics class not present in Guichan we would 
-     * be very happy to add it to Guichan.
-     *
-     * @see AllegroGraphics, HGEGraphics, OpenLayerGraphics, OpenGLGraphics, 
-     *      SDLGraphics, Image
-     * @since 0.1.0
-     */
-    class Graphics
-    {
-    public:
-        /**
-         * Alignments for text drawing.
-         */
-        enum Alignment
-        {
-            LEFT = 0,
-            CENTER,
-            RIGHT
-        };
-
-        /**
-         * Constructor.
-         */
-        Graphics();
-
-        A_DELETE_COPY(Graphics)
-
-        /**
-         * Destructor.
-         */
-        virtual ~Graphics()
-        { }
-
-        /**
-         * Initializes drawing. Called by the Gui when Gui::draw() is called.
-         * It is needed by some implementations of Graphics to perform
-         * preparations before drawing. An example of such an implementation
-         * is the OpenGLGraphics.
-         *
-         * NOTE: You will never need to call this function yourself, unless
-         *       you use a Graphics object outside of Guichan.
-         *
-         * @see _endDraw, Gui::draw
-         */
-        virtual void _beginDraw()
-        { }
-
-        /**
-         * Deinitializes drawing. Called by the Gui when a Gui::draw() is done.
-         * done. It should reset any state changes made by _beginDraw().
-         *
-         * NOTE: You will never need to call this function yourself, unless
-         *       you use a Graphics object outside of Guichan.
-         *
-         * @see _beginDraw, Gui::draw
-         */
-        virtual void _endDraw()
-        { }
-
-        /**
-         * Pushes a clip area onto the stack. The x and y coordinates in the
-         * rectangle is  relative to the last pushed clip area.
-         * If the new area falls outside the current clip area, it will be
-         * clipped as necessary.
-         *
-         * If a clip area is outside of the top clip area a clip area with
-         * zero width and height will be pushed.
-         *
-         * @param area The clip area to be pushed onto the stack.
-         * @return False if the the new area lays outside the current clip 
-         *         area.
-         */
-        virtual bool pushClipArea(Rectangle area);
-
-        /**
-         * Removes the top most clip area from the stack.
-         *
-         * @throws Exception if the stack is empty.
-         */
-        virtual void popClipArea();
-
-        /**
-         * Gets the current clip area. Usefull if you want to do drawing
-         * bypassing Graphics.
-         *
-         * @return The current clip area.
-         */
-        virtual const ClipRectangle& getCurrentClipArea();
-
-        /**
-         * Draws a part of an image.
-         *
-         * NOTE: Width and height arguments will not scale the image but
-         *       specifies the size of the part to be drawn. If you want
-         *       to draw the whole image there is a simplified version of
-         *       this function.
-         *
-         * EXAMPLE: @code drawImage(myImage, 10, 10, 20, 20, 40, 40); @endcode
-         *          Will draw a rectangular piece of myImage starting at
-         *          coordinate (10, 10) in myImage, with width and height 40.
-         *          The piece will be drawn with it's top left corner at
-         *          coordinate (20, 20).
-         *
-         * @param image The image to draw.
-         * @param srcX The source image x coordinate.
-         * @param srcY The source image y coordinate.
-         * @param dstX The destination x coordinate.
-         * @param dstY The destination y coordinate.
-         * @param width The width of the piece.
-         * @param height The height of the piece.
-         */
-        virtual void drawImage(const Image* image,
-                               int srcX,
-                               int srcY,
-                               int dstX,
-                               int dstY,
-                               int width,
-                               int height) = 0;
-        /**
-         * Draws an image. A simplified version of the other drawImage.
-         * It will draw a whole image at the coordinate you specify.
-         * It is equivalent to calling:
-         * @code drawImage(myImage, 0, 0, dstX, dstY, image->getWidth(), \
-         image->getHeight()); @endcode
-         */
-        virtual void drawImage(const Image* image, int dstX, int dstY);
-
-        /**
-         * Draws a single point/pixel.
-         *
-         * @param x The x coordinate.
-         * @param y The y coordinate.
-         */
-        virtual void drawPoint(int x, int y) = 0;
-
-        /**
-         * Ddraws a line.
-         *
-         * @param x1 The first x coordinate.
-         * @param y1 The first y coordinate.
-         * @param x2 The second x coordinate.
-         * @param y2 The second y coordinate.
-         */
-        virtual void drawLine(int x1, int y1, int x2, int y2) = 0;
-
-        /**
-         * Draws a simple, non-filled, rectangle with a one pixel width.
-         *
-         * @param rectangle The rectangle to draw.
-         */
-        virtual void drawRectangle(const Rectangle& rectangle) = 0;
-
-        /**
-         * Draws a filled rectangle.
-         *
-         * @param rectangle The filled rectangle to draw.
-         */
-        virtual void fillRectangle(const Rectangle& rectangle) = 0;
-
-        /**
-         * Sets the color to use when drawing.
-         *
-         * @param color A color.
-         * @see getColor
-         */
-        virtual void setColor(const Color& color) = 0;
-
-        /**
-         * Gets the color to use when drawing.
-         *
-         * @return The color used when drawing.
-         * @see setColor
-         */
-        virtual const Color& getColor() const = 0;
-
-    protected:
-        /**
-         * Holds the clip area stack.
-         */
-        std::stack<ClipRectangle> mClipStack;
-
-        /**
-         * Holds the current font.
-         */
-        Font* mFont;
-    };
-}  // namespace gcn
-
-#endif  // end GCN_GRAPHICS_HPP
diff --git a/src/gui/base/gui.cpp b/src/gui/base/gui.cpp
index e4827f716..73d6ff380 100644
--- a/src/gui/base/gui.cpp
+++ b/src/gui/base/gui.cpp
@@ -70,7 +70,6 @@
 #include "gui/base/basiccontainer.hpp"
 #include "gui/base/exception.hpp"
 #include "gui/base/focushandler.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/input.hpp"
 #include "gui/base/keyinput.hpp"
 #include "gui/base/keylistener.hpp"
@@ -78,6 +77,8 @@
 #include "gui/base/mouselistener.hpp"
 #include "gui/base/widget.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/gui.hpp b/src/gui/base/gui.hpp
index b1daba0fc..28a231101 100644
--- a/src/gui/base/gui.hpp
+++ b/src/gui/base/gui.hpp
@@ -71,10 +71,11 @@
 #include "gui/base/mouseevent.hpp"
 #include "gui/base/mouseinput.hpp"
 
+class Graphics;
+
 namespace gcn
 {
     class FocusHandler;
-    class Graphics;
     class Input;
     class KeyListener;
     class Widget;
diff --git a/src/gui/base/widget.cpp b/src/gui/base/widget.cpp
index 2e8719446..eeb5849c7 100644
--- a/src/gui/base/widget.cpp
+++ b/src/gui/base/widget.cpp
@@ -74,13 +74,14 @@
 #include "gui/base/event.hpp"
 #include "gui/base/exception.hpp"
 #include "gui/base/focushandler.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/keyinput.hpp"
 #include "gui/base/keylistener.hpp"
 #include "gui/base/mouseinput.hpp"
 #include "gui/base/mouselistener.hpp"
 #include "gui/base/widgetlistener.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widget.hpp b/src/gui/base/widget.hpp
index 847e340e1..b6a81261e 100644
--- a/src/gui/base/widget.hpp
+++ b/src/gui/base/widget.hpp
@@ -73,6 +73,8 @@
 
 #include "localconsts.h"
 
+class Graphics;
+
 namespace gcn
 {
     class ActionListener;
@@ -81,7 +83,6 @@ namespace gcn
     class FocusHandler;
     class FocusListener;
     class Font;
-    class Graphics;
     class KeyInput;
     class KeyListener;
     class MouseInput;
diff --git a/src/gui/base/widgets/button.cpp b/src/gui/base/widgets/button.cpp
index a52bf2d78..3e699670a 100644
--- a/src/gui/base/widgets/button.cpp
+++ b/src/gui/base/widgets/button.cpp
@@ -69,11 +69,12 @@
 
 #include "gui/base/exception.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseevent.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/button.hpp b/src/gui/base/widgets/button.hpp
index 4ae08eb16..cd41a1b02 100644
--- a/src/gui/base/widgets/button.hpp
+++ b/src/gui/base/widgets/button.hpp
@@ -67,12 +67,13 @@
 #include <string>
 
 #include "gui/base/focuslistener.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/keylistener.hpp"
 #include "gui/base/mouseevent.hpp"
 #include "gui/base/mouselistener.hpp"
 #include "gui/base/widget.hpp"
 
+#include "render/graphics.h"
+
 namespace gcn
 {
     /**
diff --git a/src/gui/base/widgets/checkbox.cpp b/src/gui/base/widgets/checkbox.cpp
index 908b4f509..615808a85 100644
--- a/src/gui/base/widgets/checkbox.cpp
+++ b/src/gui/base/widgets/checkbox.cpp
@@ -68,10 +68,11 @@
 #include "gui/base/widgets/checkbox.hpp"
 
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/container.cpp b/src/gui/base/widgets/container.cpp
index 1e6de018b..d72f2a682 100644
--- a/src/gui/base/widgets/container.cpp
+++ b/src/gui/base/widgets/container.cpp
@@ -68,7 +68,8 @@
 #include "gui/base/widgets/container.hpp"
 
 #include "gui/base/exception.hpp"
-#include "gui/base/graphics.hpp"
+
+#include "render/graphics.h"
 
 #include "debug.h"
 
diff --git a/src/gui/base/widgets/container.hpp b/src/gui/base/widgets/container.hpp
index a5cbdb31b..bffe6e884 100644
--- a/src/gui/base/widgets/container.hpp
+++ b/src/gui/base/widgets/container.hpp
@@ -67,7 +67,8 @@
 #include <list>
 
 #include "gui/base/basiccontainer.hpp"
-#include "gui/base/graphics.hpp"
+
+#include "render/graphics.h"
 
 namespace gcn
 {
diff --git a/src/gui/base/widgets/label.cpp b/src/gui/base/widgets/label.cpp
index 42fcd78f4..f4576d908 100644
--- a/src/gui/base/widgets/label.cpp
+++ b/src/gui/base/widgets/label.cpp
@@ -69,7 +69,8 @@
 
 #include "gui/base/exception.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
+
+#include "render/graphics.h"
 
 #include "debug.h"
 
diff --git a/src/gui/base/widgets/label.hpp b/src/gui/base/widgets/label.hpp
index f1ef30b89..90a395f7b 100644
--- a/src/gui/base/widgets/label.hpp
+++ b/src/gui/base/widgets/label.hpp
@@ -66,9 +66,10 @@
 
 #include <string>
 
-#include "gui/base/graphics.hpp"
 #include "gui/base/widget.hpp"
 
+#include "render/graphics.h"
+
 namespace gcn
 {
     /**
diff --git a/src/gui/base/widgets/listbox.cpp b/src/gui/base/widgets/listbox.cpp
index b97bf47d4..dcf443c77 100644
--- a/src/gui/base/widgets/listbox.cpp
+++ b/src/gui/base/widgets/listbox.cpp
@@ -69,12 +69,13 @@
 
 #include "gui/base/basiccontainer.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/listmodel.hpp"
 #include "gui/base/mouseinput.hpp"
 #include "gui/base/selectionlistener.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/radiobutton.cpp b/src/gui/base/widgets/radiobutton.cpp
index bfd5b1ff8..1e1da2622 100644
--- a/src/gui/base/widgets/radiobutton.cpp
+++ b/src/gui/base/widgets/radiobutton.cpp
@@ -68,10 +68,11 @@
 #include "gui/base/widgets/radiobutton.hpp"
 
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/scrollarea.cpp b/src/gui/base/widgets/scrollarea.cpp
index e3dcfc61c..308cee473 100644
--- a/src/gui/base/widgets/scrollarea.cpp
+++ b/src/gui/base/widgets/scrollarea.cpp
@@ -68,7 +68,8 @@
 #include "gui/base/widgets/scrollarea.hpp"
 
 #include "gui/base/exception.hpp"
-#include "gui/base/graphics.hpp"
+
+#include "render/graphics.h"
 
 #include "debug.h"
 
diff --git a/src/gui/base/widgets/slider.cpp b/src/gui/base/widgets/slider.cpp
index a1a106303..e9ab36e86 100644
--- a/src/gui/base/widgets/slider.cpp
+++ b/src/gui/base/widgets/slider.cpp
@@ -67,10 +67,11 @@
 
 #include "gui/base/widgets/slider.hpp"
 
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/textbox.cpp b/src/gui/base/widgets/textbox.cpp
index 2e9ca0563..411fc7dd5 100644
--- a/src/gui/base/widgets/textbox.cpp
+++ b/src/gui/base/widgets/textbox.cpp
@@ -69,10 +69,11 @@
 
 #include "gui/base/basiccontainer.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/textfield.cpp b/src/gui/base/widgets/textfield.cpp
index 586e49663..3349ebccb 100644
--- a/src/gui/base/widgets/textfield.cpp
+++ b/src/gui/base/widgets/textfield.cpp
@@ -68,10 +68,11 @@
 #include "gui/base/widgets/textfield.hpp"
 
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/base/widgets/window.cpp b/src/gui/base/widgets/window.cpp
index c7a108ab8..6373bcb63 100644
--- a/src/gui/base/widgets/window.cpp
+++ b/src/gui/base/widgets/window.cpp
@@ -69,9 +69,10 @@
 
 #include "gui/base/exception.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/mouseinput.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 namespace gcn
diff --git a/src/gui/sdlfont.cpp b/src/gui/sdlfont.cpp
index 8246cea94..bed4a9f31 100644
--- a/src/gui/sdlfont.cpp
+++ b/src/gui/sdlfont.cpp
@@ -444,7 +444,7 @@ void SDLFont::clear()
         mCache[f].clear();
 }
 
-void SDLFont::drawString(gcn::Graphics *const graphics,
+void SDLFont::drawString(Graphics *const graphics,
                          const std::string &text,
                          const int x, const int y)
 {
diff --git a/src/gui/sdlfont.h b/src/gui/sdlfont.h
index 79ee0fbfb..1cb6f5c99 100644
--- a/src/gui/sdlfont.h
+++ b/src/gui/sdlfont.h
@@ -131,7 +131,7 @@ class SDLFont final : public gcn::Font
         /**
          * @see Font::drawString
          */
-        void drawString(gcn::Graphics *const graphics,
+        void drawString(Graphics *const graphics,
                         const std::string &text,
                         const int x, const int y) override final;
 
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp
index 9982840de..2a91d1991 100644
--- a/src/gui/viewport.cpp
+++ b/src/gui/viewport.cpp
@@ -114,22 +114,20 @@ void Viewport::setMap(Map *const map)
     mMap = map;
 }
 
-void Viewport::draw(gcn::Graphics *gcnGraphics)
+void Viewport::draw(Graphics *graphics)
 {
     BLOCK_START("Viewport::draw 1")
     static int lastTick = tick_time;
 
     if (!mMap || !player_node)
     {
-        gcnGraphics->setColor(gcn::Color(64, 64, 64));
-        gcnGraphics->fillRectangle(
+        graphics->setColor(gcn::Color(64, 64, 64));
+        graphics->fillRectangle(
                 gcn::Rectangle(0, 0, getWidth(), getHeight()));
         BLOCK_END("Viewport::draw 1")
         return;
     }
 
-    Graphics *const graphics = static_cast<Graphics* const>(gcnGraphics);
-
     // Avoid freaking out when tick_time overflows
     if (tick_time < lastTick)
         lastTick = tick_time;
@@ -260,7 +258,7 @@ void Viewport::draw(gcn::Graphics *gcnGraphics)
         miniStatusWindow->drawIcons(graphics);
 
     // Draw contained widgets
-    WindowContainer::draw(gcnGraphics);
+    WindowContainer::draw(graphics);
     BLOCK_END("Viewport::draw 1")
 }
 
diff --git a/src/gui/viewport.h b/src/gui/viewport.h
index 848a1ae8c..7e18d8395 100644
--- a/src/gui/viewport.h
+++ b/src/gui/viewport.h
@@ -83,7 +83,7 @@ class Viewport final : public WindowContainer,
         /**
          * Draws the viewport.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Implements player to keep following mouse.
diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp
index 4a477b802..e6f03493f 100644
--- a/src/gui/widgets/avatarlistbox.cpp
+++ b/src/gui/widgets/avatarlistbox.cpp
@@ -90,7 +90,7 @@ AvatarListBox::~AvatarListBox()
     }
 }
 
-void AvatarListBox::draw(gcn::Graphics *gcnGraphics)
+void AvatarListBox::draw(Graphics *gcnGraphics)
 {
     BLOCK_START("AvatarListBox::draw")
     if (!mListModel || !player_node)
diff --git a/src/gui/widgets/avatarlistbox.h b/src/gui/widgets/avatarlistbox.h
index 99c1132b2..46e5c8dea 100644
--- a/src/gui/widgets/avatarlistbox.h
+++ b/src/gui/widgets/avatarlistbox.h
@@ -53,7 +53,7 @@ public:
     /**
      * Draws the list box.
      */
-    void draw(gcn::Graphics *gcnGraphics) override final;
+    void draw(Graphics *gcnGraphics) override final;
 
     void mousePressed(gcn::MouseEvent &event) override final;
 
diff --git a/src/gui/widgets/browserbox.cpp b/src/gui/widgets/browserbox.cpp
index d7ce9ab12..e0fbf3d17 100644
--- a/src/gui/widgets/browserbox.cpp
+++ b/src/gui/widgets/browserbox.cpp
@@ -37,10 +37,11 @@
 #include "utils/stringutils.h"
 #include "utils/timer.h"
 
-#include "gui/base/graphics.hpp"
 #include "gui/base/font.hpp"
 #include "gui/base/cliprectangle.hpp"
 
+#include "render/graphics.h"
+
 #include <algorithm>
 
 #include "debug.h"
@@ -446,13 +447,15 @@ void BrowserBox::mouseMoved(gcn::MouseEvent &event)
         ? static_cast<int>(i - mLinks.begin()) : -1;
 }
 
-void BrowserBox::draw(gcn::Graphics *graphics)
+void BrowserBox::draw(Graphics *graphics)
 {
     BLOCK_START("BrowserBox::draw")
-    const gcn::ClipRectangle &cr = graphics->getCurrentClipArea();
+    const gcn::ClipRectangle *const cr = graphics->getCurrentClipArea();
+    if (!cr)
+        return;
     Graphics *const graphics2 = static_cast<Graphics *const>(graphics);
-    mYStart = cr.y - cr.yOffset;
-    const int yEnd = mYStart + cr.height;
+    mYStart = cr->y - cr->yOffset;
+    const int yEnd = mYStart + cr->height;
     if (mYStart < 0)
         mYStart = 0;
 
diff --git a/src/gui/widgets/browserbox.h b/src/gui/widgets/browserbox.h
index deefd886a..85ce9b96b 100644
--- a/src/gui/widgets/browserbox.h
+++ b/src/gui/widgets/browserbox.h
@@ -165,7 +165,7 @@ class BrowserBox final : public gcn::Widget,
         /**
          * Draws the browser box.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void updateHeight();
 
diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp
index faefd6f6c..8954ecf8e 100644
--- a/src/gui/widgets/button.cpp
+++ b/src/gui/widgets/button.cpp
@@ -350,7 +350,7 @@ void Button::updateAlpha()
     }
 }
 
-void Button::draw(gcn::Graphics *graphics)
+void Button::draw(Graphics *graphics)
 {
     BLOCK_START("Button::draw")
     int mode;
@@ -437,7 +437,7 @@ void Button::draw(gcn::Graphics *graphics)
     switch (mAlignment)
     {
         default:
-        case gcn::Graphics::LEFT:
+        case Graphics::LEFT:
         {
             if (mImages)
             {
@@ -450,7 +450,7 @@ void Button::draw(gcn::Graphics *graphics)
             }
             break;
         }
-        case gcn::Graphics::CENTER:
+        case Graphics::CENTER:
         {
             const int width1 = font->getWidth(mCaption);
             if (mImages)
@@ -465,7 +465,7 @@ void Button::draw(gcn::Graphics *graphics)
             }
             break;
         }
-        case gcn::Graphics::RIGHT:
+        case Graphics::RIGHT:
         {
             const int width1 = font->getWidth(mCaption);
             textX = width - width1 - padding;
diff --git a/src/gui/widgets/button.h b/src/gui/widgets/button.h
index aeec63b82..949993a48 100644
--- a/src/gui/widgets/button.h
+++ b/src/gui/widgets/button.h
@@ -102,7 +102,7 @@ class Button final : public gcn::Button,
         /**
          * Draws the button.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Update the alpha value to the button components.
diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp
index fa227f5ca..e72296516 100644
--- a/src/gui/widgets/checkbox.cpp
+++ b/src/gui/widgets/checkbox.cpp
@@ -94,7 +94,7 @@ CheckBox::~CheckBox()
     }
 }
 
-void CheckBox::draw(gcn::Graphics *const graphics)
+void CheckBox::draw(Graphics *const graphics)
 {
     BLOCK_START("CheckBox::draw")
     drawBox(graphics);
@@ -129,7 +129,7 @@ void CheckBox::updateAlpha()
     }
 }
 
-void CheckBox::drawBox(gcn::Graphics *const graphics)
+void CheckBox::drawBox(Graphics *const graphics)
 {
     if (!mSkin || !mDrawBox)
         return;
diff --git a/src/gui/widgets/checkbox.h b/src/gui/widgets/checkbox.h
index d0864d0d5..a49c38d47 100644
--- a/src/gui/widgets/checkbox.h
+++ b/src/gui/widgets/checkbox.h
@@ -59,7 +59,7 @@ class CheckBox final : public gcn::CheckBox,
         /**
          * Draws the caption, then calls drawBox to draw the check box.
          */
-        void draw(gcn::Graphics *const graphics) override final;
+        void draw(Graphics *const graphics) override final;
 
         /**
          * Update the alpha value to the checkbox components.
@@ -69,7 +69,7 @@ class CheckBox final : public gcn::CheckBox,
         /**
          * Draws the check box, not the caption.
          */
-        void drawBox(gcn::Graphics *const graphics);
+        void drawBox(Graphics *const graphics);
 
         /**
          * Called when the mouse enteres the widget area.
diff --git a/src/gui/widgets/colorpage.cpp b/src/gui/widgets/colorpage.cpp
index 9730f7006..1d85874df 100644
--- a/src/gui/widgets/colorpage.cpp
+++ b/src/gui/widgets/colorpage.cpp
@@ -47,7 +47,7 @@ ColorPage::~ColorPage()
 {
 }
 
-void ColorPage::draw(gcn::Graphics *graphics)
+void ColorPage::draw(Graphics *graphics)
 {
     BLOCK_START("ColorPage::draw")
 
diff --git a/src/gui/widgets/colorpage.h b/src/gui/widgets/colorpage.h
index c1c90eddf..84a3011a9 100644
--- a/src/gui/widgets/colorpage.h
+++ b/src/gui/widgets/colorpage.h
@@ -36,7 +36,7 @@ class ColorPage final : public ListBox
 
         ~ColorPage();
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void resetAction();
 
diff --git a/src/gui/widgets/desktop.cpp b/src/gui/widgets/desktop.cpp
index 32c8a4988..4a4a73b53 100644
--- a/src/gui/widgets/desktop.cpp
+++ b/src/gui/widgets/desktop.cpp
@@ -103,7 +103,7 @@ void Desktop::widgetResized(const gcn::Event &event A_UNUSED)
     setBestFittingWallpaper();
 }
 
-void Desktop::draw(gcn::Graphics *graphics)
+void Desktop::draw(Graphics *graphics)
 {
     BLOCK_START("Desktop::draw")
     Graphics *const g = static_cast<Graphics *const>(graphics);
diff --git a/src/gui/widgets/desktop.h b/src/gui/widgets/desktop.h
index 88034fbbc..6982ce525 100644
--- a/src/gui/widgets/desktop.h
+++ b/src/gui/widgets/desktop.h
@@ -61,7 +61,7 @@ class Desktop final : public Container, private gcn::WidgetListener
 
         void widgetResized(const gcn::Event &event) override final;
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void postInit();
 
diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp
index 3669d3eab..354c88423 100644
--- a/src/gui/widgets/dropdown.cpp
+++ b/src/gui/widgets/dropdown.cpp
@@ -214,7 +214,7 @@ void DropDown::updateAlpha()
     }
 }
 
-void DropDown::draw(gcn::Graphics* graphics)
+void DropDown::draw(Graphics* graphics)
 {
     BLOCK_START("DropDown::draw")
     int h;
@@ -286,7 +286,7 @@ void DropDown::draw(gcn::Graphics* graphics)
     BLOCK_END("DropDown::draw")
 }
 
-void DropDown::drawFrame(gcn::Graphics *graphics)
+void DropDown::drawFrame(Graphics *graphics)
 {
     BLOCK_START("DropDown::drawFrame")
     const int bs2 = getFrameSize();
@@ -296,7 +296,7 @@ void DropDown::drawFrame(gcn::Graphics *graphics)
     BLOCK_END("DropDown::drawFrame")
 }
 
-void DropDown::drawButton(gcn::Graphics *graphics)
+void DropDown::drawButton(Graphics *graphics)
 {
     const int height = mDroppedDown ? mFoldedUpHeight : mDimension.height;
 
diff --git a/src/gui/widgets/dropdown.h b/src/gui/widgets/dropdown.h
index da2eb64f9..af566fb69 100644
--- a/src/gui/widgets/dropdown.h
+++ b/src/gui/widgets/dropdown.h
@@ -82,9 +82,9 @@ class DropDown final : public gcn::ActionListener,
          */
         void updateAlpha();
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
-        void drawFrame(gcn::Graphics *graphics) override final;
+        void drawFrame(Graphics *graphics) override final;
 
         // Inherited from KeyListener
 
@@ -142,7 +142,7 @@ class DropDown final : public gcn::ActionListener,
          *
          * @param graphics a Graphics object to draw with.
          */
-        void drawButton(gcn::Graphics *graphics);
+        void drawButton(Graphics *graphics);
 
         PopupList *mPopup;
         gcn::Color mShadowColor;
diff --git a/src/gui/widgets/dropshortcutcontainer.cpp b/src/gui/widgets/dropshortcutcontainer.cpp
index 857eed024..892a74638 100644
--- a/src/gui/widgets/dropshortcutcontainer.cpp
+++ b/src/gui/widgets/dropshortcutcontainer.cpp
@@ -94,7 +94,7 @@ void DropShortcutContainer::setWidget2(const Widget2 *const widget)
     mUnEquipedColor2 = getThemeColor(Theme::ITEM_NOT_EQUIPPED_OUTLINE);
 }
 
-void DropShortcutContainer::draw(gcn::Graphics *graphics)
+void DropShortcutContainer::draw(Graphics *graphics)
 {
     if (!dropShortcut)
         return;
diff --git a/src/gui/widgets/dropshortcutcontainer.h b/src/gui/widgets/dropshortcutcontainer.h
index b5a144cba..6b7a9f151 100644
--- a/src/gui/widgets/dropshortcutcontainer.h
+++ b/src/gui/widgets/dropshortcutcontainer.h
@@ -50,7 +50,7 @@ class DropShortcutContainer final : public ShortcutContainer
         /**
          * Draws the items.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Handles mouse when dragged.
diff --git a/src/gui/widgets/emotepage.cpp b/src/gui/widgets/emotepage.cpp
index f2f84ed56..869ae5d08 100644
--- a/src/gui/widgets/emotepage.cpp
+++ b/src/gui/widgets/emotepage.cpp
@@ -59,7 +59,7 @@ EmotePage::~EmotePage()
     mVertexes = nullptr;
 }
 
-void EmotePage::draw(gcn::Graphics *graphics)
+void EmotePage::draw(Graphics *graphics)
 {
     BLOCK_START("EmotePage::draw")
 
diff --git a/src/gui/widgets/emotepage.h b/src/gui/widgets/emotepage.h
index 1603bab5e..9cd2867aa 100644
--- a/src/gui/widgets/emotepage.h
+++ b/src/gui/widgets/emotepage.h
@@ -41,7 +41,7 @@ class EmotePage final : public gcn::Widget,
 
         ~EmotePage();
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void mousePressed(gcn::MouseEvent &mouseEvent) override final;
 
diff --git a/src/gui/widgets/emoteshortcutcontainer.cpp b/src/gui/widgets/emoteshortcutcontainer.cpp
index 8d83ffeae..bdb5c3163 100644
--- a/src/gui/widgets/emoteshortcutcontainer.cpp
+++ b/src/gui/widgets/emoteshortcutcontainer.cpp
@@ -99,7 +99,7 @@ void EmoteShortcutContainer::setWidget2(const Widget2 *const widget)
     mForegroundColor2 = getThemeColor(Theme::TEXT_OUTLINE);
 }
 
-void EmoteShortcutContainer::draw(gcn::Graphics *graphics)
+void EmoteShortcutContainer::draw(Graphics *graphics)
 {
     if (!emoteShortcut)
         return;
diff --git a/src/gui/widgets/emoteshortcutcontainer.h b/src/gui/widgets/emoteshortcutcontainer.h
index 2c99aaf87..62999207e 100644
--- a/src/gui/widgets/emoteshortcutcontainer.h
+++ b/src/gui/widgets/emoteshortcutcontainer.h
@@ -53,7 +53,7 @@ class EmoteShortcutContainer final : public ShortcutContainer
         /**
          * Draws the items.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Handles mouse when dragged.
diff --git a/src/gui/widgets/extendedlistbox.cpp b/src/gui/widgets/extendedlistbox.cpp
index 6aaf85bbe..66065295c 100644
--- a/src/gui/widgets/extendedlistbox.cpp
+++ b/src/gui/widgets/extendedlistbox.cpp
@@ -23,9 +23,10 @@
 #include "gui/widgets/extendedlistmodel.h"
 
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/listmodel.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 ExtendedListBox::ExtendedListBox(const Widget2 *const widget,
@@ -47,7 +48,7 @@ ExtendedListBox::~ExtendedListBox()
 {
 }
 
-void ExtendedListBox::draw(gcn::Graphics *graphics)
+void ExtendedListBox::draw(Graphics *graphics)
 {
     if (!mListModel)
         return;
diff --git a/src/gui/widgets/extendedlistbox.h b/src/gui/widgets/extendedlistbox.h
index 30e7a32fb..9fa14fa9e 100644
--- a/src/gui/widgets/extendedlistbox.h
+++ b/src/gui/widgets/extendedlistbox.h
@@ -59,7 +59,7 @@ class ExtendedListBox final : public ListBox
         /**
          * Draws the list box.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void adjustSize() override;
 
diff --git a/src/gui/widgets/guitable.cpp b/src/gui/widgets/guitable.cpp
index 9630f5c17..6928b11d8 100644
--- a/src/gui/widgets/guitable.cpp
+++ b/src/gui/widgets/guitable.cpp
@@ -30,9 +30,10 @@
 #include "utils/dtor.h"
 
 #include "gui/base/actionlistener.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/key.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 float GuiTable::mAlpha = 1.0;
@@ -293,7 +294,7 @@ void GuiTable::installActionListeners()
 }
 
 // -- widget ops
-void GuiTable::draw(gcn::Graphics* graphics)
+void GuiTable::draw(Graphics* graphics)
 {
     if (!mModel || !getRowHeight())
         return;
diff --git a/src/gui/widgets/guitable.h b/src/gui/widgets/guitable.h
index e91482078..2154d0889 100644
--- a/src/gui/widgets/guitable.h
+++ b/src/gui/widgets/guitable.h
@@ -113,7 +113,7 @@ public:
     }
 
     // Inherited from Widget
-    void draw(gcn::Graphics* graphics) override final;
+    void draw(Graphics* graphics) override final;
 
     gcn::Widget *getWidgetAt(int x, int y) override final A_WARN_UNUSED;
 
diff --git a/src/gui/widgets/icon.cpp b/src/gui/widgets/icon.cpp
index 4fb511c85..e9b7cd525 100644
--- a/src/gui/widgets/icon.cpp
+++ b/src/gui/widgets/icon.cpp
@@ -67,7 +67,7 @@ void Icon::setImage(Image *const image)
     }
 }
 
-void Icon::draw(gcn::Graphics *g)
+void Icon::draw(Graphics *g)
 {
     BLOCK_START("Icon::draw")
     if (mImage)
diff --git a/src/gui/widgets/icon.h b/src/gui/widgets/icon.h
index 98cb83b61..a39cec517 100644
--- a/src/gui/widgets/icon.h
+++ b/src/gui/widgets/icon.h
@@ -68,7 +68,7 @@ class Icon final : public gcn::Widget,
         /**
          * Draws the Icon.
          */
-        void draw(gcn::Graphics *g) override final;
+        void draw(Graphics *g) override final;
 
     private:
         Image *mImage;
diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp
index 0361c54e7..eedbc1bd0 100644
--- a/src/gui/widgets/itemcontainer.cpp
+++ b/src/gui/widgets/itemcontainer.cpp
@@ -245,7 +245,7 @@ void ItemContainer::logic()
     BLOCK_END("ItemContainer::logic")
 }
 
-void ItemContainer::draw(gcn::Graphics *graphics)
+void ItemContainer::draw(Graphics *graphics)
 {
     if (!mInventory || !mShowMatrix)
         return;
diff --git a/src/gui/widgets/itemcontainer.h b/src/gui/widgets/itemcontainer.h
index c7ca851d9..cfacb05c6 100644
--- a/src/gui/widgets/itemcontainer.h
+++ b/src/gui/widgets/itemcontainer.h
@@ -85,7 +85,7 @@ class ItemContainer final : public gcn::Widget,
         /**
          * Draws the items.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         // KeyListener
         void keyPressed(gcn::KeyEvent &event) override final;
diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp
index 1334afae7..78b9c0e62 100644
--- a/src/gui/widgets/itemshortcutcontainer.cpp
+++ b/src/gui/widgets/itemshortcutcontainer.cpp
@@ -112,7 +112,7 @@ void ItemShortcutContainer::setWidget2(const Widget2 *const widget)
     mForegroundColor2 = getThemeColor(Theme::TEXT_OUTLINE);
 }
 
-void ItemShortcutContainer::draw(gcn::Graphics *graphics)
+void ItemShortcutContainer::draw(Graphics *graphics)
 {
     BLOCK_START("ItemShortcutContainer::draw")
     const ItemShortcut *const selShortcut = itemShortcut[mNumber];
diff --git a/src/gui/widgets/itemshortcutcontainer.h b/src/gui/widgets/itemshortcutcontainer.h
index f9ec24589..c2dbe93a3 100644
--- a/src/gui/widgets/itemshortcutcontainer.h
+++ b/src/gui/widgets/itemshortcutcontainer.h
@@ -51,7 +51,7 @@ class ItemShortcutContainer final : public ShortcutContainer
         /**
          * Draws the items.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Handles mouse when dragged.
diff --git a/src/gui/widgets/label.cpp b/src/gui/widgets/label.cpp
index 767830f5d..89ba17cd6 100644
--- a/src/gui/widgets/label.cpp
+++ b/src/gui/widgets/label.cpp
@@ -76,7 +76,7 @@ void Label::init()
         mPadding = 0;
 }
 
-void Label::draw(gcn::Graphics* graphics)
+void Label::draw(Graphics* graphics)
 {
     BLOCK_START("Label::draw")
     int textX;
diff --git a/src/gui/widgets/label.h b/src/gui/widgets/label.h
index 2fc2393fb..0b96b87e4 100644
--- a/src/gui/widgets/label.h
+++ b/src/gui/widgets/label.h
@@ -59,7 +59,7 @@ class Label final : public gcn::Label, public Widget2
         /**
          * Draws the label.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void adjustSize();
 
diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp
index 767067801..0a7956476 100644
--- a/src/gui/widgets/listbox.cpp
+++ b/src/gui/widgets/listbox.cpp
@@ -31,9 +31,10 @@
 
 #include "gui/base/focushandler.hpp"
 #include "gui/base/font.hpp"
-#include "gui/base/graphics.hpp"
 #include "gui/base/listmodel.hpp"
 
+#include "render/graphics.h"
+
 #include "debug.h"
 
 float ListBox::mAlpha = 1.0;
@@ -98,7 +99,7 @@ void ListBox::updateAlpha()
         mAlpha = alpha;
 }
 
-void ListBox::draw(gcn::Graphics *graphics)
+void ListBox::draw(Graphics *graphics)
 {
     if (!mListModel)
         return;
diff --git a/src/gui/widgets/listbox.h b/src/gui/widgets/listbox.h
index 784193fdf..459aea2e3 100644
--- a/src/gui/widgets/listbox.h
+++ b/src/gui/widgets/listbox.h
@@ -58,7 +58,7 @@ class ListBox : public gcn::ListBox,
         /**
          * Draws the list box.
          */
-        void draw(gcn::Graphics *graphics) override;
+        void draw(Graphics *graphics) override;
 
         /**
          * Update the alpha value to the graphic components.
diff --git a/src/gui/widgets/passwordfield.cpp b/src/gui/widgets/passwordfield.cpp
index b2ee6ccad..1b562b7f0 100644
--- a/src/gui/widgets/passwordfield.cpp
+++ b/src/gui/widgets/passwordfield.cpp
@@ -31,7 +31,7 @@ PasswordField::PasswordField(const Widget2 *const widget,
 {
 }
 
-void PasswordField::draw(gcn::Graphics *graphics)
+void PasswordField::draw(Graphics *graphics)
 {
     BLOCK_START("PasswordField::draw")
     // std::string uses cow, thus cheap copy
diff --git a/src/gui/widgets/passwordfield.h b/src/gui/widgets/passwordfield.h
index 322d71b8b..f72350763 100644
--- a/src/gui/widgets/passwordfield.h
+++ b/src/gui/widgets/passwordfield.h
@@ -44,7 +44,7 @@ class PasswordField final : public TextField
         /**
          * Draws the password field.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
     protected:
         int mPasswordChar;
diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp
index 6fda932bf..260f80099 100644
--- a/src/gui/widgets/playerbox.cpp
+++ b/src/gui/widgets/playerbox.cpp
@@ -107,7 +107,7 @@ void PlayerBox::init(std::string name, std::string selectedName)
     }
 }
 
-void PlayerBox::draw(gcn::Graphics *graphics)
+void PlayerBox::draw(Graphics *graphics)
 {
     BLOCK_START("PlayerBox::draw")
     if (mBeing)
@@ -130,7 +130,7 @@ void PlayerBox::draw(gcn::Graphics *graphics)
     BLOCK_END("PlayerBox::draw")
 }
 
-void PlayerBox::drawFrame(gcn::Graphics *graphics)
+void PlayerBox::drawFrame(Graphics *graphics)
 {
     BLOCK_START("PlayerBox::drawFrame")
     if (mDrawBackground)
diff --git a/src/gui/widgets/playerbox.h b/src/gui/widgets/playerbox.h
index b78c8c3f1..9671715b0 100644
--- a/src/gui/widgets/playerbox.h
+++ b/src/gui/widgets/playerbox.h
@@ -71,12 +71,12 @@ class PlayerBox final : public Widget2,
         /**
          * Draws the scroll area.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Draws the background and border of the scroll area.
          */
-        void drawFrame(gcn::Graphics *graphics) override final;
+        void drawFrame(Graphics *graphics) override final;
 
         Being *getBeing() A_WARN_UNUSED
         { return mBeing; }
diff --git a/src/gui/widgets/popup.cpp b/src/gui/widgets/popup.cpp
index c0de328e7..56d5d0d0c 100644
--- a/src/gui/widgets/popup.cpp
+++ b/src/gui/widgets/popup.cpp
@@ -94,7 +94,7 @@ void Popup::setWindowContainer(WindowContainer *const wc)
     windowContainer = wc;
 }
 
-void Popup::draw(gcn::Graphics *graphics)
+void Popup::draw(Graphics *graphics)
 {
     BLOCK_START("Popup::draw")
     Graphics *const g = static_cast<Graphics*>(graphics);
diff --git a/src/gui/widgets/popup.h b/src/gui/widgets/popup.h
index 7e7001891..f0fd1b932 100644
--- a/src/gui/widgets/popup.h
+++ b/src/gui/widgets/popup.h
@@ -75,7 +75,7 @@ class Popup : public Container, public gcn::MouseListener,
         /**
          * Draws the popup.
          */
-        void draw(gcn::Graphics *graphics) override;
+        void draw(Graphics *graphics) override;
 
         /**
          * Sets the size of this popup.
diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp
index 61ecc9080..28c87f4ec 100644
--- a/src/gui/widgets/progressbar.cpp
+++ b/src/gui/widgets/progressbar.cpp
@@ -146,7 +146,7 @@ void ProgressBar::updateAlpha()
     mAlpha = alpha;
 }
 
-void ProgressBar::draw(gcn::Graphics *graphics)
+void ProgressBar::draw(Graphics *graphics)
 {
     BLOCK_START("ProgressBar::draw")
     updateAlpha();
diff --git a/src/gui/widgets/progressbar.h b/src/gui/widgets/progressbar.h
index ca32fc165..022d86ab3 100644
--- a/src/gui/widgets/progressbar.h
+++ b/src/gui/widgets/progressbar.h
@@ -70,7 +70,7 @@ class ProgressBar final : public gcn::Widget,
         /**
          * Draws the progress bar.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Sets the current progress.
diff --git a/src/gui/widgets/progressindicator.cpp b/src/gui/widgets/progressindicator.cpp
index d89ff7f2a..358518132 100644
--- a/src/gui/widgets/progressindicator.cpp
+++ b/src/gui/widgets/progressindicator.cpp
@@ -65,7 +65,7 @@ void ProgressIndicator::logic()
     BLOCK_END("ProgressIndicator::logic")
 }
 
-void ProgressIndicator::draw(gcn::Graphics *graphics)
+void ProgressIndicator::draw(Graphics *graphics)
 {
     BLOCK_START("ProgressIndicator::draw")
     if (mIndicator)
diff --git a/src/gui/widgets/progressindicator.h b/src/gui/widgets/progressindicator.h
index fc9ab5b5f..8dd33bf4d 100644
--- a/src/gui/widgets/progressindicator.h
+++ b/src/gui/widgets/progressindicator.h
@@ -46,7 +46,7 @@ class ProgressIndicator final : public gcn::Widget,
 
         void logic() override final;
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
     private:
         SimpleAnimation *mIndicator;
diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp
index a81afa037..4a47a4b4e 100644
--- a/src/gui/widgets/radiobutton.cpp
+++ b/src/gui/widgets/radiobutton.cpp
@@ -110,7 +110,7 @@ void RadioButton::updateAlpha()
     }
 }
 
-void RadioButton::drawBox(gcn::Graphics* graphics)
+void RadioButton::drawBox(Graphics* graphics)
 {
     if (!mSkin)
         return;
@@ -154,7 +154,7 @@ void RadioButton::drawBox(gcn::Graphics* graphics)
     }
 }
 
-void RadioButton::draw(gcn::Graphics* graphics)
+void RadioButton::draw(Graphics* graphics)
 {
     BLOCK_START("RadioButton::draw")
     drawBox(graphics);
diff --git a/src/gui/widgets/radiobutton.h b/src/gui/widgets/radiobutton.h
index dca2d1167..ff6f5aafd 100644
--- a/src/gui/widgets/radiobutton.h
+++ b/src/gui/widgets/radiobutton.h
@@ -56,13 +56,13 @@ class RadioButton final : public gcn::RadioButton,
         /**
          * Draws the radiobutton, not the caption.
          */
-        void drawBox(gcn::Graphics* graphics) override final;
+        void drawBox(Graphics* graphics) override final;
 
         /**
          * Implementation of the draw methods.
          * Thus, avoiding the rhomb around the radio button.
          */
-        void draw(gcn::Graphics* graphics) override final;
+        void draw(Graphics* graphics) override final;
 
         /**
          * Called when the mouse enteres the widget area.
diff --git a/src/gui/widgets/scrollarea.cpp b/src/gui/widgets/scrollarea.cpp
index a260142a1..89e75f4d7 100644
--- a/src/gui/widgets/scrollarea.cpp
+++ b/src/gui/widgets/scrollarea.cpp
@@ -248,7 +248,7 @@ void ScrollArea::updateAlpha()
     }
 }
 
-void ScrollArea::draw(gcn::Graphics *graphics)
+void ScrollArea::draw(Graphics *graphics)
 {
     BLOCK_START("ScrollArea::draw")
     if (mVBarVisible || mHBarVisible)
@@ -329,7 +329,7 @@ void ScrollArea::draw(gcn::Graphics *graphics)
     BLOCK_END("ScrollArea::draw")
 }
 
-void ScrollArea::updateCalcFlag(gcn::Graphics *const graphics)
+void ScrollArea::updateCalcFlag(Graphics *const graphics)
 {
     if (!mRedraw)
     {
@@ -356,7 +356,7 @@ void ScrollArea::updateCalcFlag(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::drawFrame(gcn::Graphics *graphics)
+void ScrollArea::drawFrame(Graphics *graphics)
 {
     BLOCK_START("ScrollArea::drawFrame")
     if (mOpaque)
@@ -392,7 +392,7 @@ void ScrollArea::setOpaque(bool opaque)
     setFrameSize(mOpaque ? 2 : 0);
 }
 
-void ScrollArea::drawButton(gcn::Graphics *const graphics,
+void ScrollArea::drawButton(Graphics *const graphics,
                             const BUTTON_DIR dir)
 {
     int state = 0;
@@ -430,7 +430,7 @@ void ScrollArea::drawButton(gcn::Graphics *const graphics,
     }
 }
 
-void ScrollArea::calcButton(gcn::Graphics *const graphics,
+void ScrollArea::calcButton(Graphics *const graphics,
                             const BUTTON_DIR dir)
 {
     int state = 0;
@@ -468,7 +468,7 @@ void ScrollArea::calcButton(gcn::Graphics *const graphics,
     }
 }
 
-void ScrollArea::drawVBar(gcn::Graphics *const graphics)
+void ScrollArea::drawVBar(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getVerticalBarDimension();
     Graphics *const g = static_cast<Graphics*>(graphics);
@@ -491,7 +491,7 @@ void ScrollArea::drawVBar(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::calcVBar(gcn::Graphics *const graphics)
+void ScrollArea::calcVBar(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getVerticalBarDimension();
     Graphics *const g = static_cast<Graphics *const>(graphics);
@@ -514,7 +514,7 @@ void ScrollArea::calcVBar(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::drawHBar(gcn::Graphics *const graphics)
+void ScrollArea::drawHBar(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getHorizontalBarDimension();
     Graphics *const g = static_cast<Graphics*>(graphics);
@@ -539,7 +539,7 @@ void ScrollArea::drawHBar(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::calcHBar(gcn::Graphics *const graphics)
+void ScrollArea::calcHBar(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getHorizontalBarDimension();
     Graphics *const g = static_cast<Graphics*>(graphics);
@@ -564,7 +564,7 @@ void ScrollArea::calcHBar(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::drawVMarker(gcn::Graphics *const graphics)
+void ScrollArea::drawVMarker(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getVerticalMarkerDimension();
 
@@ -580,7 +580,7 @@ void ScrollArea::drawVMarker(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::calcVMarker(gcn::Graphics *const graphics)
+void ScrollArea::calcVMarker(Graphics *const graphics)
 {
     const gcn::Rectangle &dim = getVerticalMarkerDimension();
 
@@ -596,7 +596,7 @@ void ScrollArea::calcVMarker(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::drawHMarker(gcn::Graphics *const graphics)
+void ScrollArea::drawHMarker(Graphics *const graphics)
 {
     const gcn::Rectangle dim = getHorizontalMarkerDimension();
 
@@ -612,7 +612,7 @@ void ScrollArea::drawHMarker(gcn::Graphics *const graphics)
     }
 }
 
-void ScrollArea::calcHMarker(gcn::Graphics *const graphics)
+void ScrollArea::calcHMarker(Graphics *const graphics)
 {
     const gcn::Rectangle dim = getHorizontalMarkerDimension();
 
diff --git a/src/gui/widgets/scrollarea.h b/src/gui/widgets/scrollarea.h
index 58bd73107..fe60399df 100644
--- a/src/gui/widgets/scrollarea.h
+++ b/src/gui/widgets/scrollarea.h
@@ -84,12 +84,12 @@ class ScrollArea final : public gcn::ScrollArea,
         /**
          * Draws the scroll area.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Draws the background and border of the scroll area.
          */
-        void drawFrame(gcn::Graphics *graphics) override final;
+        void drawFrame(Graphics *graphics) override final;
 
         /**
          * Sets whether the widget should draw its background or not.
@@ -158,19 +158,19 @@ class ScrollArea final : public gcn::ScrollArea,
          */
         void init(std::string skinName);
 
-        void drawButton(gcn::Graphics *const graphics, const BUTTON_DIR dir);
-        void calcButton(gcn::Graphics *const graphics, const BUTTON_DIR dir);
-        void drawVBar(gcn::Graphics *const graphics) override final;
-        void drawHBar(gcn::Graphics *const graphics) override final;
-        void drawVMarker(gcn::Graphics *const graphics) override final;
-        void drawHMarker(gcn::Graphics *const graphics) override final;
+        void drawButton(Graphics *const graphics, const BUTTON_DIR dir);
+        void calcButton(Graphics *const graphics, const BUTTON_DIR dir);
+        void drawVBar(Graphics *const graphics) override final;
+        void drawHBar(Graphics *const graphics) override final;
+        void drawVMarker(Graphics *const graphics) override final;
+        void drawHMarker(Graphics *const graphics) override final;
 
-        void calcVBar(gcn::Graphics *const graphics);
-        void calcHBar(gcn::Graphics *const graphics);
-        void calcVMarker(gcn::Graphics *const graphics);
-        void calcHMarker(gcn::Graphics *const graphics);
+        void calcVBar(Graphics *const graphics);
+        void calcHBar(Graphics *const graphics);
+        void calcVMarker(Graphics *const graphics);
+        void calcHMarker(Graphics *const graphics);
 
-        void updateCalcFlag(gcn::Graphics *const graphics);
+        void updateCalcFlag(Graphics *const graphics);
 
         static int instances;
         static float mAlpha;
diff --git a/src/gui/widgets/shoplistbox.cpp b/src/gui/widgets/shoplistbox.cpp
index 4a7fda039..644023c43 100644
--- a/src/gui/widgets/shoplistbox.cpp
+++ b/src/gui/widgets/shoplistbox.cpp
@@ -82,7 +82,7 @@ void ShopListBox::setPlayersMoney(const int money)
     mPlayerMoney = money;
 }
 
-void ShopListBox::draw(gcn::Graphics *gcnGraphics)
+void ShopListBox::draw(Graphics *gcnGraphics)
 {
     BLOCK_START("ShopListBox::draw")
     if (!mListModel || !mShopItems)
diff --git a/src/gui/widgets/shoplistbox.h b/src/gui/widgets/shoplistbox.h
index 095d187eb..509af8393 100644
--- a/src/gui/widgets/shoplistbox.h
+++ b/src/gui/widgets/shoplistbox.h
@@ -56,7 +56,7 @@ class ShopListBox final : public ListBox
         /**
          * Draws the list box.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * gives information about the current player's money
diff --git a/src/gui/widgets/shortcutcontainer.h b/src/gui/widgets/shortcutcontainer.h
index 88e27320a..4d4ff2389 100644
--- a/src/gui/widgets/shortcutcontainer.h
+++ b/src/gui/widgets/shortcutcontainer.h
@@ -53,7 +53,7 @@ class ShortcutContainer : public gcn::Widget,
         /**
          * Draws the shortcuts
          */
-        virtual void draw(gcn::Graphics *graphics) override = 0;
+        virtual void draw(Graphics *graphics) override = 0;
 
         /**
          * Invoked when a widget changes its size. This is used to determine
diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp
index 750b58528..1427bb6eb 100644
--- a/src/gui/widgets/slider.cpp
+++ b/src/gui/widgets/slider.cpp
@@ -118,7 +118,7 @@ void Slider::updateAlpha()
     }
 }
 
-void Slider::draw(gcn::Graphics *graphics)
+void Slider::draw(Graphics *graphics)
 {
     BLOCK_START("Slider::draw")
     if (!buttons[0].grid[HSTART] || !buttons[1].grid[HSTART]
diff --git a/src/gui/widgets/slider.h b/src/gui/widgets/slider.h
index d5d4a30fe..c59e0c47f 100644
--- a/src/gui/widgets/slider.h
+++ b/src/gui/widgets/slider.h
@@ -65,7 +65,7 @@ class Slider final : public gcn::Slider,
         /**
          * Draws the slider.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Called when the mouse enteres the widget area.
diff --git a/src/gui/widgets/sliderlist.cpp b/src/gui/widgets/sliderlist.cpp
index 4416a00b7..b75f65820 100644
--- a/src/gui/widgets/sliderlist.cpp
+++ b/src/gui/widgets/sliderlist.cpp
@@ -103,7 +103,7 @@ void SliderList::resize()
     updateLabel();
 }
 
-void SliderList::draw(gcn::Graphics *graphics)
+void SliderList::draw(Graphics *graphics)
 {
     BLOCK_START("SliderList::draw")
     const int width = mDimension.width;
diff --git a/src/gui/widgets/sliderlist.h b/src/gui/widgets/sliderlist.h
index 016a60290..e0f63517b 100644
--- a/src/gui/widgets/sliderlist.h
+++ b/src/gui/widgets/sliderlist.h
@@ -55,7 +55,7 @@ class SliderList final : public Container,
 
         void resize();
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void action(const gcn::ActionEvent &event) override final;
 
diff --git a/src/gui/widgets/spellshortcutcontainer.cpp b/src/gui/widgets/spellshortcutcontainer.cpp
index e59b9fbdb..7c59676b9 100644
--- a/src/gui/widgets/spellshortcutcontainer.cpp
+++ b/src/gui/widgets/spellshortcutcontainer.cpp
@@ -90,7 +90,7 @@ void SpellShortcutContainer::setWidget2(const Widget2 *const widget)
     mForegroundColor2 = getThemeColor(Theme::TEXT_OUTLINE);
 }
 
-void SpellShortcutContainer::draw(gcn::Graphics *graphics)
+void SpellShortcutContainer::draw(Graphics *graphics)
 {
     if (!spellShortcut)
         return;
diff --git a/src/gui/widgets/spellshortcutcontainer.h b/src/gui/widgets/spellshortcutcontainer.h
index 37e7b5660..3115e47fe 100644
--- a/src/gui/widgets/spellshortcutcontainer.h
+++ b/src/gui/widgets/spellshortcutcontainer.h
@@ -50,7 +50,7 @@ class SpellShortcutContainer final : public ShortcutContainer
         /**
          * Draws the items.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Handles mouse when dragged.
diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp
index 8cb8fd78a..2a212ce75 100644
--- a/src/gui/widgets/tabbedarea.cpp
+++ b/src/gui/widgets/tabbedarea.cpp
@@ -139,7 +139,7 @@ Tab *TabbedArea::getTab(const std::string &name) const
     return nullptr;
 }
 
-void TabbedArea::draw(gcn::Graphics *graphics)
+void TabbedArea::draw(Graphics *graphics)
 {
     BLOCK_START("TabbedArea::draw")
     if (mTabs.empty())
diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h
index 7a023903f..dede91767 100644
--- a/src/gui/widgets/tabbedarea.h
+++ b/src/gui/widgets/tabbedarea.h
@@ -60,7 +60,7 @@ class TabbedArea final : public Widget2,
         /**
          * Draw the tabbed area.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Return how many tabs have been created.
diff --git a/src/gui/widgets/tabs/tab.cpp b/src/gui/widgets/tabs/tab.cpp
index 4f1703d31..d0561cadf 100644
--- a/src/gui/widgets/tabs/tab.cpp
+++ b/src/gui/widgets/tabs/tab.cpp
@@ -153,7 +153,7 @@ void Tab::updateAlpha()
     }
 }
 
-void Tab::draw(gcn::Graphics *graphics)
+void Tab::draw(Graphics *graphics)
 {
     BLOCK_START("Tab::draw")
     int mode = TAB_STANDARD;
diff --git a/src/gui/widgets/tabs/tab.h b/src/gui/widgets/tabs/tab.h
index fa9846ab4..66f7521d9 100644
--- a/src/gui/widgets/tabs/tab.h
+++ b/src/gui/widgets/tabs/tab.h
@@ -68,7 +68,7 @@ class Tab : public gcn::BasicContainer,
         /**
          * Draw the tabbed area.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Set the normal color for the tab's text.
diff --git a/src/gui/widgets/textbox.cpp b/src/gui/widgets/textbox.cpp
index 3f56ecfcf..8aaca4211 100644
--- a/src/gui/widgets/textbox.cpp
+++ b/src/gui/widgets/textbox.cpp
@@ -350,7 +350,7 @@ void TextBox::keyPressed(gcn::KeyEvent& keyEvent)
     keyEvent.consume();
 }
 
-void TextBox::draw(gcn::Graphics* graphics)
+void TextBox::draw(Graphics* graphics)
 {
     BLOCK_START("TextBox::draw")
     if (mOpaque)
diff --git a/src/gui/widgets/textbox.h b/src/gui/widgets/textbox.h
index 797707716..d8841cfeb 100644
--- a/src/gui/widgets/textbox.h
+++ b/src/gui/widgets/textbox.h
@@ -62,7 +62,7 @@ class TextBox final : public gcn::TextBox,
 
         void keyPressed(gcn::KeyEvent& keyEvent) override final;
 
-        void draw(gcn::Graphics* graphics) override final;
+        void draw(Graphics* graphics) override final;
 
         void setForegroundColor(const gcn::Color &color);
 
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp
index b655de830..b1d188f22 100644
--- a/src/gui/widgets/textfield.cpp
+++ b/src/gui/widgets/textfield.cpp
@@ -137,7 +137,7 @@ void TextField::updateAlpha()
     }
 }
 
-void TextField::draw(gcn::Graphics *graphics)
+void TextField::draw(Graphics *graphics)
 {
     BLOCK_START("TextField::draw")
     updateAlpha();
@@ -155,7 +155,7 @@ void TextField::draw(gcn::Graphics *graphics)
     BLOCK_END("TextField::draw")
 }
 
-void TextField::drawFrame(gcn::Graphics *graphics)
+void TextField::drawFrame(Graphics *graphics)
 {
     BLOCK_START("TextField::drawFrame")
     const int bs = 2 * mFrameSize;
@@ -661,12 +661,14 @@ void TextField::handleCopy() const
     sendBuffer(text);
 }
 
-void TextField::drawCaret(gcn::Graphics* graphics, int x)
+void TextField::drawCaret(Graphics* graphics, int x)
 {
-    const gcn::Rectangle &clipArea = graphics->getCurrentClipArea();
+    const gcn::Rectangle *const clipArea = graphics->getCurrentClipArea();
+    if (!clipArea)
+        return;
 
     graphics->setColor(*mCaretColor);
-    graphics->drawLine(x + mPadding, clipArea.height - mPadding,
+    graphics->drawLine(x + mPadding, clipArea->height - mPadding,
         x + mPadding, mPadding);
 }
 
diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h
index d8ab2c830..d3d1ff0eb 100644
--- a/src/gui/widgets/textfield.h
+++ b/src/gui/widgets/textfield.h
@@ -60,7 +60,7 @@ class TextField : public gcn::TextField,
         /**
          * Draws the text field.
          */
-        virtual void draw(gcn::Graphics *graphics) override;
+        virtual void draw(Graphics *graphics) override;
 
         /**
          * Update the alpha value to the graphic components.
@@ -70,7 +70,7 @@ class TextField : public gcn::TextField,
         /**
          * Draws the background and border.
          */
-        void drawFrame(gcn::Graphics *graphics) override final;
+        void drawFrame(Graphics *graphics) override final;
 
         /**
          * Determine whether the field should be numeric or not
@@ -142,7 +142,7 @@ class TextField : public gcn::TextField,
         void caretDeleteWord();
 
     protected:
-        void drawCaret(gcn::Graphics* graphics, int x) override final;
+        void drawCaret(Graphics* graphics, int x) override final;
 
         void fixScroll();
 
diff --git a/src/gui/widgets/textpreview.cpp b/src/gui/widgets/textpreview.cpp
index 8d473dd46..5cfb2abb5 100644
--- a/src/gui/widgets/textpreview.cpp
+++ b/src/gui/widgets/textpreview.cpp
@@ -79,7 +79,7 @@ TextPreview::~TextPreview()
     }
 }
 
-void TextPreview::draw(gcn::Graphics* graphics)
+void TextPreview::draw(Graphics* graphics)
 {
     BLOCK_START("TextPreview::draw")
     if (client->getGuiAlpha() != mAlpha)
diff --git a/src/gui/widgets/textpreview.h b/src/gui/widgets/textpreview.h
index bfb361a9b..f529e470c 100644
--- a/src/gui/widgets/textpreview.h
+++ b/src/gui/widgets/textpreview.h
@@ -102,7 +102,7 @@ class TextPreview final : public gcn::Widget,
          *
          * @param graphics graphics to draw into
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         /**
          * Set opacity for this widget (whether or not to show the background
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index c78582a91..26ca0a29f 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -74,7 +74,7 @@ Window::Window(const std::string &caption, const bool modal,
     mVertexes(new ImageCollection),
     mCaptionOffsetX(7),
     mCaptionOffsetY(5),
-    mCaptionAlign(gcn::Graphics::LEFT),
+    mCaptionAlign(Graphics::LEFT),
     mTitlePadding(4),
     mGripPadding(2),
     mResizeHandles(-1),
@@ -123,12 +123,12 @@ Window::Window(const std::string &caption, const bool modal,
             mCaptionOffsetY = getOption("captionoffsety");
             if (!mCaptionOffsetY)
                 mCaptionOffsetY = 5;
-            mCaptionAlign = static_cast<gcn::Graphics::Alignment>(
+            mCaptionAlign = static_cast<Graphics::Alignment>(
                 getOption("captionalign"));
-            if (mCaptionAlign < gcn::Graphics::LEFT
-                || mCaptionAlign > gcn::Graphics::RIGHT)
+            if (mCaptionAlign < Graphics::LEFT
+                || mCaptionAlign > Graphics::RIGHT)
             {
-                mCaptionAlign = gcn::Graphics::LEFT;
+                mCaptionAlign = Graphics::LEFT;
             }
             setTitleBarHeight(getOption("titlebarHeight"));
             if (!mTitleBarHeight)
@@ -203,7 +203,7 @@ void Window::setWindowContainer(WindowContainer *const wc)
     windowContainer = wc;
 }
 
-void Window::draw(gcn::Graphics *graphics)
+void Window::draw(Graphics *graphics)
 {
     if (!mSkin)
         return;
diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h
index 29fd589a5..68ce1a293 100644
--- a/src/gui/widgets/window.h
+++ b/src/gui/widgets/window.h
@@ -80,7 +80,7 @@ class Window : public gcn::Window,
         /**
          * Draws the window.
          */
-        void draw(gcn::Graphics *graphics) override;
+        void draw(Graphics *graphics) override;
 
         /**
          * Sets the size of this window.
@@ -501,7 +501,7 @@ class Window : public gcn::Window,
         ImageCollection *mVertexes;
         int mCaptionOffsetX;
         int mCaptionOffsetY;
-        gcn::Graphics::Alignment mCaptionAlign;
+        Graphics::Alignment mCaptionAlign;
         int mTitlePadding;
         int mGripPadding;
         int mResizeHandles;
diff --git a/src/gui/widgets/windowcontainer.cpp b/src/gui/widgets/windowcontainer.cpp
index d23f29bad..5adde3cae 100644
--- a/src/gui/widgets/windowcontainer.cpp
+++ b/src/gui/widgets/windowcontainer.cpp
@@ -79,7 +79,7 @@ void WindowContainer::moveWidgetAfter(gcn::Widget *const after,
 }
 
 #ifdef USE_PROFILER
-void WindowContainer::draw(gcn::Graphics* graphics)
+void WindowContainer::draw(Graphics* graphics)
 {
     BLOCK_START("WindowContainer::draw")
     Container::draw(graphics);
diff --git a/src/gui/widgets/windowcontainer.h b/src/gui/widgets/windowcontainer.h
index 2ee4ea37d..d940a4e91 100644
--- a/src/gui/widgets/windowcontainer.h
+++ b/src/gui/widgets/windowcontainer.h
@@ -57,7 +57,7 @@ class WindowContainer : public Container
                              gcn::Widget *const widget);
 
 #ifdef USE_PROFILER
-        void draw(gcn::Graphics* graphics);
+        void draw(Graphics* graphics);
 #endif
 
     private:
diff --git a/src/gui/windowmenu.cpp b/src/gui/windowmenu.cpp
index a094b5b08..127d3657d 100644
--- a/src/gui/windowmenu.cpp
+++ b/src/gui/windowmenu.cpp
@@ -419,7 +419,7 @@ void WindowMenu::saveButtons() const
         config.deleteKey("windowmenu" + toString(f));
 }
 
-void WindowMenu::drawChildren(gcn::Graphics* graphics)
+void WindowMenu::drawChildren(Graphics* graphics)
 {
     if (mHaveMouse || !mAutoHide || (mAutoHide == 1
         && mainGraphics && (mSmallWindow || mainGraphics->mWidth > 800)))
diff --git a/src/gui/windowmenu.h b/src/gui/windowmenu.h
index a87f655d8..bf8298b75 100644
--- a/src/gui/windowmenu.h
+++ b/src/gui/windowmenu.h
@@ -118,7 +118,7 @@ class WindowMenu final : public Container,
 #endif
 
     protected:
-        void drawChildren(gcn::Graphics* graphics) override final;
+        void drawChildren(Graphics* graphics) override final;
 
     private:
         inline void addButton(const char *const text,
diff --git a/src/gui/windows/buydialog.cpp b/src/gui/windows/buydialog.cpp
index cfefa8159..ccddc76cd 100644
--- a/src/gui/windows/buydialog.cpp
+++ b/src/gui/windows/buydialog.cpp
@@ -247,7 +247,7 @@ void BuyDialog::init()
     mSlider = new Slider(1.0);
     mQuantityLabel = new Label(this, strprintf(
         "%d / %d", mAmountItems, mMaxItems));
-    mQuantityLabel->setAlignment(gcn::Graphics::CENTER);
+    mQuantityLabel->setAlignment(Graphics::CENTER);
     // TRANSLATORS: buy dialog label
     mMoneyLabel = new Label(this, strprintf(
         _("Price: %s / Total: %s"), "", ""));
diff --git a/src/gui/windows/chatwindow.cpp b/src/gui/windows/chatwindow.cpp
index a21efbe52..5bff2ee4b 100644
--- a/src/gui/windows/chatwindow.cpp
+++ b/src/gui/windows/chatwindow.cpp
@@ -1902,7 +1902,7 @@ void ChatWindow::mouseExited(gcn::MouseEvent& mouseEvent)
     Window::mouseExited(mouseEvent);
 }
 
-void ChatWindow::draw(gcn::Graphics* graphics)
+void ChatWindow::draw(Graphics* graphics)
 {
     BLOCK_START("ChatWindow::draw")
     if (!mAutoHide || mHaveMouse)
diff --git a/src/gui/windows/chatwindow.h b/src/gui/windows/chatwindow.h
index 742c79876..d20f68ecc 100644
--- a/src/gui/windows/chatwindow.h
+++ b/src/gui/windows/chatwindow.h
@@ -280,7 +280,7 @@ class ChatWindow final : public Window,
 
         void mouseExited(gcn::MouseEvent& mouseEvent A_UNUSED) override final;
 
-        void draw(gcn::Graphics* graphics) override final;
+        void draw(Graphics* graphics) override final;
 
         void updateVisibility();
 
diff --git a/src/gui/windows/connectiondialog.cpp b/src/gui/windows/connectiondialog.cpp
index 6d01dcaae..b0ffc25cd 100644
--- a/src/gui/windows/connectiondialog.cpp
+++ b/src/gui/windows/connectiondialog.cpp
@@ -66,7 +66,7 @@ void ConnectionDialog::action(const gcn::ActionEvent &)
     client->setState(mCancelState);
 }
 
-void ConnectionDialog::draw(gcn::Graphics *graphics)
+void ConnectionDialog::draw(Graphics *graphics)
 {
     BLOCK_START("ConnectionDialog::draw")
     // Don't draw the window background, only draw the children
diff --git a/src/gui/windows/connectiondialog.h b/src/gui/windows/connectiondialog.h
index dd3c84e5e..773522839 100644
--- a/src/gui/windows/connectiondialog.h
+++ b/src/gui/windows/connectiondialog.h
@@ -57,7 +57,7 @@ class ConnectionDialog final : public Window, private gcn::ActionListener
          */
         void action(const gcn::ActionEvent &) override;
 
-        void draw(gcn::Graphics *graphics) override;
+        void draw(Graphics *graphics) override;
 
     private:
         State mCancelState;
diff --git a/src/gui/windows/debugwindow.cpp b/src/gui/windows/debugwindow.cpp
index 30d202054..4f57b9798 100644
--- a/src/gui/windows/debugwindow.cpp
+++ b/src/gui/windows/debugwindow.cpp
@@ -129,7 +129,7 @@ void DebugWindow::slowLogic()
     BLOCK_END("DebugWindow::slowLogic")
 }
 
-void DebugWindow::draw(gcn::Graphics *g)
+void DebugWindow::draw(Graphics *g)
 {
     BLOCK_START("DebugWindow::draw")
     Window::draw(g);
diff --git a/src/gui/windows/debugwindow.h b/src/gui/windows/debugwindow.h
index 13e73c29e..83d6676da 100644
--- a/src/gui/windows/debugwindow.h
+++ b/src/gui/windows/debugwindow.h
@@ -147,7 +147,7 @@ class DebugWindow final : public Window
          */
         void slowLogic();
 
-        void draw(gcn::Graphics *g) override final;
+        void draw(Graphics *g) override final;
 
         void setPing(int pingTime);
 
diff --git a/src/gui/windows/equipmentwindow.cpp b/src/gui/windows/equipmentwindow.cpp
index c796c8433..e7bf02aa9 100644
--- a/src/gui/windows/equipmentwindow.cpp
+++ b/src/gui/windows/equipmentwindow.cpp
@@ -156,7 +156,7 @@ EquipmentWindow::~EquipmentWindow()
     mVertexes = nullptr;
 }
 
-void EquipmentWindow::draw(gcn::Graphics *graphics)
+void EquipmentWindow::draw(Graphics *graphics)
 {
     BLOCK_START("EquipmentWindow::draw")
     // Draw window graphics
diff --git a/src/gui/windows/equipmentwindow.h b/src/gui/windows/equipmentwindow.h
index 4b6ae8b4c..1ce8611a7 100644
--- a/src/gui/windows/equipmentwindow.h
+++ b/src/gui/windows/equipmentwindow.h
@@ -81,7 +81,7 @@ class EquipmentWindow final : public Window, public gcn::ActionListener
         /**
          * Draws the equipment window.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void action(const gcn::ActionEvent &event) override final;
 
diff --git a/src/gui/windows/minimap.cpp b/src/gui/windows/minimap.cpp
index 02be64a13..181055053 100644
--- a/src/gui/windows/minimap.cpp
+++ b/src/gui/windows/minimap.cpp
@@ -233,7 +233,7 @@ void Minimap::toggle()
     mShow = isWindowVisible();
 }
 
-void Minimap::draw(gcn::Graphics *graphics)
+void Minimap::draw(Graphics *graphics)
 {
     BLOCK_START("Minimap::draw")
     Window::draw(graphics);
diff --git a/src/gui/windows/minimap.h b/src/gui/windows/minimap.h
index 90c08db0f..661412c57 100644
--- a/src/gui/windows/minimap.h
+++ b/src/gui/windows/minimap.h
@@ -60,7 +60,7 @@ class Minimap final : public Window, public ConfigListener
         /**
          * Draws the minimap.
          */
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void mouseMoved(gcn::MouseEvent &event) override final;
 
diff --git a/src/gui/windows/ministatuswindow.cpp b/src/gui/windows/ministatuswindow.cpp
index b5832c7b7..3513bb2ff 100644
--- a/src/gui/windows/ministatuswindow.cpp
+++ b/src/gui/windows/ministatuswindow.cpp
@@ -308,7 +308,7 @@ void MiniStatusWindow::logic()
     BLOCK_END("MiniStatusWindow::logic")
 }
 
-void MiniStatusWindow::draw(gcn::Graphics *graphics)
+void MiniStatusWindow::draw(Graphics *graphics)
 {
     BLOCK_START("MiniStatusWindow::draw")
     drawChildren(graphics);
diff --git a/src/gui/windows/ministatuswindow.h b/src/gui/windows/ministatuswindow.h
index 2a5903eca..7748f51d1 100644
--- a/src/gui/windows/ministatuswindow.h
+++ b/src/gui/windows/ministatuswindow.h
@@ -68,7 +68,7 @@ class MiniStatusWindow final : public Popup,
 
         void logic() override final;
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void mouseMoved(gcn::MouseEvent &mouseEvent) override final;
 
diff --git a/src/gui/windows/outfitwindow.cpp b/src/gui/windows/outfitwindow.cpp
index d686056ac..677337b70 100644
--- a/src/gui/windows/outfitwindow.cpp
+++ b/src/gui/windows/outfitwindow.cpp
@@ -91,8 +91,8 @@ OutfitWindow::OutfitWindow():
     setMinWidth(145);
     setMinHeight(220);
 
-    mCurrentLabel->setAlignment(gcn::Graphics::CENTER);
-    mKeyLabel->setAlignment(gcn::Graphics::CENTER);
+    mCurrentLabel->setAlignment(Graphics::CENTER);
+    mKeyLabel->setAlignment(Graphics::CENTER);
 
     mUnequipCheck->setActionEventId("unequip");
     mUnequipCheck->addActionListener(this);
@@ -310,7 +310,7 @@ void OutfitWindow::copyOutfit(const int src, const int dst)
     save();
 }
 
-void OutfitWindow::draw(gcn::Graphics *graphics)
+void OutfitWindow::draw(Graphics *graphics)
 {
     BLOCK_START("OutfitWindow::draw")
     Window::draw(graphics);
diff --git a/src/gui/windows/outfitwindow.h b/src/gui/windows/outfitwindow.h
index 6d54889e6..01e72aefc 100644
--- a/src/gui/windows/outfitwindow.h
+++ b/src/gui/windows/outfitwindow.h
@@ -52,7 +52,7 @@ class OutfitWindow final : public Window,
 
         void action(const gcn::ActionEvent &event) override final;
 
-        void draw(gcn::Graphics *graphics) override final;
+        void draw(Graphics *graphics) override final;
 
         void mousePressed(gcn::MouseEvent &event) override final;
 
diff --git a/src/gui/windows/selldialog.cpp b/src/gui/windows/selldialog.cpp
index 15389a9c3..a4ff29f78 100644
--- a/src/gui/windows/selldialog.cpp
+++ b/src/gui/windows/selldialog.cpp
@@ -94,7 +94,7 @@ void SellDialog::init()
 
     mQuantityLabel = new Label(this, strprintf(
         "%d / %d", mAmountItems, mMaxItems));
-    mQuantityLabel->setAlignment(gcn::Graphics::CENTER);
+    mQuantityLabel->setAlignment(Graphics::CENTER);
     // TRANSLATORS: sell dialog label
     mMoneyLabel = new Label(this, strprintf(_("Price: %s / Total: %s"),
                                       "", ""));
diff --git a/src/gui/windows/serverdialog.cpp b/src/gui/windows/serverdialog.cpp
index dec80b50a..82a264ac7 100644
--- a/src/gui/windows/serverdialog.cpp
+++ b/src/gui/windows/serverdialog.cpp
@@ -157,7 +157,7 @@ public:
         mHighlightColor = getThemeColor(Theme::HIGHLIGHT);
     }
 
-    void draw(gcn::Graphics *graphics) override final
+    void draw(Graphics *graphics) override final
     {
         if (!mListModel)
             return;
diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp
index c4505b37c..674848725 100644
--- a/src/gui/windows/skilldialog.cpp
+++ b/src/gui/windows/skilldialog.cpp
@@ -100,7 +100,7 @@ class SkillListBox final : public ListBox
             return static_cast<SkillModel*>(mListModel)->getSkillAt(selected);
         }
 
-        void draw(gcn::Graphics *gcnGraphics) override
+        void draw(Graphics *gcnGraphics) override
         {
             if (!mListModel)
                 return;
diff --git a/src/render/graphics.cpp b/src/render/graphics.cpp
index 7e3687006..653b4d4c0 100644
--- a/src/render/graphics.cpp
+++ b/src/render/graphics.cpp
@@ -20,6 +20,49 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/*      _______   __   __   __   ______   __   __   _______   __   __
+ *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
+ *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
+ *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
+ *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
+ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
+ * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
+ *
+ * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
+ *
+ *
+ * Per Larsson a.k.a finalman
+ * Olof Naessén a.k.a jansem/yakslem
+ *
+ * Visit: http://guichan.sourceforge.net
+ *
+ * License: (BSD)
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Guichan nor the names of its contributors may
+ *    be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #include "render/graphics.h"
 
 #include "main.h"
@@ -48,11 +91,11 @@
 Graphics *mainGraphics = nullptr;
 
 Graphics::Graphics() :
-    gcn::Graphics(),
     mWidth(0),
     mHeight(0),
     mActualWidth(0),
     mActualHeight(0),
+    mClipStack(),
     mWindow(nullptr),
 #ifdef USE_SDL2
     mRenderer(nullptr),
@@ -503,3 +546,82 @@ void Graphics::setWindowSize(const int width A_UNUSED,
     SDL_SetWindowSize(mWindow, width, height);
 #endif
 }
+
+bool Graphics::pushClipArea(gcn::Rectangle area)
+{
+    // Ignore area with a negate width or height
+    // by simple pushing an empty clip area
+    // to the stack.
+    if (area.width < 0 || area.height < 0)
+    {
+        gcn::ClipRectangle carea;
+        mClipStack.push(carea);
+        return true;
+    }
+
+    if (mClipStack.empty())
+    {
+        gcn::ClipRectangle carea;
+        carea.x = area.x;
+        carea.y = area.y;
+        carea.width = area.width;
+        carea.height = area.height;
+        carea.xOffset = area.x;
+        carea.yOffset = area.y;
+        mClipStack.push(carea);
+        return true;
+    }
+
+    const gcn::ClipRectangle &top = mClipStack.top();
+    gcn::ClipRectangle carea;
+    carea = area;
+    carea.xOffset = top.xOffset + carea.x;
+    carea.yOffset = top.yOffset + carea.y;
+    carea.x += top.xOffset;
+    carea.y += top.yOffset;
+
+    // Clamp the pushed clip rectangle.
+    if (carea.x < top.x)
+        carea.x = top.x;
+
+    if (carea.y < top.y)
+        carea.y = top.y;
+
+    if (carea.x + carea.width > top.x + top.width)
+    {
+        carea.width = top.x + top.width - carea.x;
+
+        if (carea.width < 0)
+            carea.width = 0;
+    }
+
+    if (carea.y + carea.height > top.y + top.height)
+    {
+        carea.height = top.y + top.height - carea.y;
+
+        if (carea.height < 0)
+            carea.height = 0;
+    }
+
+    const bool result = carea.isIntersecting(top);
+
+    mClipStack.push(carea);
+
+    return result;
+}
+
+void Graphics::popClipArea()
+{
+    if (mClipStack.empty())
+        return;
+
+    mClipStack.pop();
+}
+
+const gcn::ClipRectangle *Graphics::getCurrentClipArea() const
+{
+    if (mClipStack.empty())
+        return nullptr;
+
+    return &mClipStack.top();
+}
diff --git a/src/render/graphics.h b/src/render/graphics.h
index 93d46b475..53eb4af12 100644
--- a/src/render/graphics.h
+++ b/src/render/graphics.h
@@ -20,6 +20,49 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/*      _______   __   __   __   ______   __   __   _______   __   __
+ *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
+ *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
+ *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
+ *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
+ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
+ * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
+ *
+ * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
+ *
+ *
+ * Per Larsson a.k.a finalman
+ * Olof Naessén a.k.a jansem/yakslem
+ *
+ * Visit: http://guichan.sourceforge.net
+ *
+ * License: (BSD)
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Guichan nor the names of its contributors may
+ *    be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #ifndef RENDER_GRAPHICS_H
 #define RENDER_GRAPHICS_H
 
@@ -29,13 +72,15 @@
 
 #include "render/renderers.h"
 
+#include "gui/base/cliprectangle.hpp"
 #include "gui/base/color.hpp"
-#include "gui/base/graphics.hpp"
 
 #ifdef USE_SDL2
 #include <SDL_render.h>
 #endif
 
+#include <stack>
+
 #include "localconsts.h"
 
 class Image;
@@ -94,7 +139,7 @@ class ImageRect final
 /**
  * A central point of control for graphics.
  */
-class Graphics : public gcn::Graphics
+class Graphics
 {
     public:
         A_DELETE_COPY(Graphics)
@@ -104,6 +149,16 @@ class Graphics : public gcn::Graphics
          */
         virtual ~Graphics();
 
+        /**
+         * Alignments for text drawing.
+         */
+        enum Alignment
+        {
+            LEFT = 0,
+            CENTER,
+            RIGHT
+        };
+
         void setWindow(SDL_Window *const window,
                        const int width, const int height)
         {
@@ -145,14 +200,6 @@ class Graphics : public gcn::Graphics
          */
         virtual bool resizeScreen(const int width, const int height);
 
-        //  override unused abstract function
-        void drawImage(const gcn::Image* image A_UNUSED,
-                       int srcX A_UNUSED, int srcY A_UNUSED,
-                       int dstX A_UNUSED, int dstY A_UNUSED,
-                       int width A_UNUSED, int height A_UNUSED) override final
-        {
-        }
-
         /**
          * Draws a resclaled version of the image
          */
@@ -211,8 +258,7 @@ class Graphics : public gcn::Graphics
                                 const int w, const int h,
                                 const ImageRect &imgRect) = 0;
 
-        virtual void fillRectangle(const gcn::Rectangle& rectangle)
-                                   override = 0;
+        virtual void fillRectangle(const gcn::Rectangle& rectangle) = 0;
 
         /**
          * Updates the screen. This is done by either copying the buffer to the
@@ -246,9 +292,6 @@ class Graphics : public gcn::Graphics
                              const int x2, const int y2,
                              const int width, const int height);
 
-        const gcn::Font *getFont() const A_WARN_UNUSED
-        { return mFont; }
-
         gcn::ClipRectangle &getTopClip() A_WARN_UNUSED
         { return mClipStack.top(); }
 
@@ -288,7 +331,7 @@ class Graphics : public gcn::Graphics
         virtual void initArrays()
         { }
 
-        void setColor(const gcn::Color &color) override
+        virtual void setColor(const gcn::Color &color)
         {
             mColor = color;
             mColor2 = color;
@@ -305,7 +348,7 @@ class Graphics : public gcn::Graphics
             mAlpha = (color.a != 255);
         }
 
-        const gcn::Color &getColor() const override
+        const gcn::Color &getColor() const
         { return mColor; }
 
         const gcn::Color &getColor2() const
@@ -353,6 +396,87 @@ class Graphics : public gcn::Graphics
 
         void setScale(int scale);
 
+        /**
+         * Pushes a clip area onto the stack. The x and y coordinates in the
+         * rectangle is  relative to the last pushed clip area.
+         * If the new area falls outside the current clip area, it will be
+         * clipped as necessary.
+         *
+         * If a clip area is outside of the top clip area a clip area with
+         * zero width and height will be pushed.
+         *
+         * @param area The clip area to be pushed onto the stack.
+         * @return False if the the new area lays outside the current clip 
+         *         area.
+         */
+        virtual bool pushClipArea(gcn::Rectangle area);
+
+        /**
+         * Removes the top most clip area from the stack.
+         *
+         * @throws Exception if the stack is empty.
+         */
+        virtual void popClipArea();
+
+        /**
+         * Ddraws a line.
+         *
+         * @param x1 The first x coordinate.
+         * @param y1 The first y coordinate.
+         * @param x2 The second x coordinate.
+         * @param y2 The second y coordinate.
+         */
+        virtual void drawLine(int x1, int y1, int x2, int y2) = 0;
+
+        /**
+         * Draws a simple, non-filled, rectangle with a one pixel width.
+         *
+         * @param rectangle The rectangle to draw.
+         */
+        virtual void drawRectangle(const gcn::Rectangle &rectangle) = 0;
+
+        /**
+         * Gets the current clip area. Usefull if you want to do drawing
+         * bypassing Graphics.
+         *
+         * @return The current clip area.
+         */
+        virtual const gcn::ClipRectangle *getCurrentClipArea() const;
+
+        /**
+         * Draws a single point/pixel.
+         *
+         * @param x The x coordinate.
+         * @param y The y coordinate.
+         */
+        virtual void drawPoint(int x, int y) = 0;
+
+        /**
+          * Initializes drawing. Called by the Gui when Gui::draw() is called.
+          * It is needed by some implementations of Graphics to perform
+          * preparations before drawing. An example of such an implementation
+          * is the OpenGLGraphics.
+          *
+          * NOTE: You will never need to call this function yourself, unless
+          *       you use a Graphics object outside of Guichan.
+          *
+          * @see _endDraw, Gui::draw
+          */
+        virtual void _beginDraw()
+        { }
+
+        /**
+          * Deinitializes drawing. Called by the Gui when a Gui::draw() is done.
+          * done. It should reset any state changes made by _beginDraw().
+          *
+          * NOTE: You will never need to call this function yourself, unless
+          *       you use a Graphics object outside of Guichan.
+          *
+          * @see _beginDraw, Gui::draw
+          */
+        virtual void _endDraw()
+        { }
+
         int mWidth;
         int mHeight;
         int mActualWidth;
@@ -382,6 +506,11 @@ class Graphics : public gcn::Graphics
 
         bool videoInfo();
 
+        /**
+         * Holds the clip area stack.
+         */
+        std::stack<gcn::ClipRectangle> mClipStack;
+
         SDL_Window *mWindow;
 
 #ifdef USE_SDL2
diff --git a/src/render/mobileopenglgraphics.cpp b/src/render/mobileopenglgraphics.cpp
index 82bf04dc8..252dc0766 100644
--- a/src/render/mobileopenglgraphics.cpp
+++ b/src/render/mobileopenglgraphics.cpp
@@ -963,7 +963,7 @@ bool MobileOpenGLGraphics::pushClipArea(gcn::Rectangle area)
         transY = -clipArea.yOffset;
     }
 
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &clipArea = mClipStack.top();
     transX += clipArea.xOffset;
@@ -990,7 +990,7 @@ void MobileOpenGLGraphics::popClipArea()
     int transX = -clipArea1.xOffset;
     int transY = -clipArea1.yOffset;
 
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/normalopenglgraphics.cpp b/src/render/normalopenglgraphics.cpp
index e8e1a2116..aea3f5d24 100644
--- a/src/render/normalopenglgraphics.cpp
+++ b/src/render/normalopenglgraphics.cpp
@@ -1223,7 +1223,7 @@ bool NormalOpenGLGraphics::pushClipArea(gcn::Rectangle area)
         transY = -clipArea.yOffset;
     }
 
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &clipArea = mClipStack.top();
     transX += clipArea.xOffset;
@@ -1251,7 +1251,7 @@ void NormalOpenGLGraphics::popClipArea()
     int transX = -clipArea1.xOffset;
     int transY = -clipArea1.yOffset;
 
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/nullopenglgraphics.cpp b/src/render/nullopenglgraphics.cpp
index 3ea1e4182..d1c6ed0a6 100644
--- a/src/render/nullopenglgraphics.cpp
+++ b/src/render/nullopenglgraphics.cpp
@@ -947,7 +947,7 @@ bool NullOpenGLGraphics::pushClipArea(gcn::Rectangle area)
         transY = -clipArea.yOffset;
     }
 
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &clipArea = mClipStack.top();
     transX += clipArea.xOffset;
@@ -958,7 +958,7 @@ bool NullOpenGLGraphics::pushClipArea(gcn::Rectangle area)
 
 void NullOpenGLGraphics::popClipArea()
 {
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/safeopenglgraphics.cpp b/src/render/safeopenglgraphics.cpp
index bf9334655..c27db4f47 100644
--- a/src/render/safeopenglgraphics.cpp
+++ b/src/render/safeopenglgraphics.cpp
@@ -535,7 +535,7 @@ bool SafeOpenGLGraphics::pushClipArea(gcn::Rectangle area)
         transY = -clipArea.yOffset;
     }
 
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &clipArea = mClipStack.top();
 
@@ -551,7 +551,7 @@ bool SafeOpenGLGraphics::pushClipArea(gcn::Rectangle area)
 
 void SafeOpenGLGraphics::popClipArea()
 {
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/sdl2graphics.cpp b/src/render/sdl2graphics.cpp
index 285b2dac2..46d8360b6 100644
--- a/src/render/sdl2graphics.cpp
+++ b/src/render/sdl2graphics.cpp
@@ -20,6 +20,49 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/*      _______   __   __   __   ______   __   __   _______   __   __
+ *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
+ *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
+ *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
+ *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
+ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
+ * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
+ *
+ * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
+ *
+ *
+ * Per Larsson a.k.a finalman
+ * Olof Naessén a.k.a jansem/yakslem
+ *
+ * Visit: http://guichan.sourceforge.net
+ *
+ * License: (BSD)
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Guichan nor the names of its contributors may
+ *    be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #ifdef USE_SDL2
 
 #include "render/sdl2graphics.h"
@@ -621,7 +664,7 @@ void SDLGraphics::_endDraw()
 
 bool SDLGraphics::pushClipArea(gcn::Rectangle area)
 {
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &carea = mClipStack.top();
     const SDL_Rect rect =
@@ -637,7 +680,7 @@ bool SDLGraphics::pushClipArea(gcn::Rectangle area)
 
 void SDLGraphics::popClipArea()
 {
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/sdl2graphics.h b/src/render/sdl2graphics.h
index c4e0d74a7..1e581dc39 100644
--- a/src/render/sdl2graphics.h
+++ b/src/render/sdl2graphics.h
@@ -20,6 +20,49 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/*      _______   __   __   __   ______   __   __   _______   __   __
+ *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
+ *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
+ *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
+ *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
+ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
+ * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
+ *
+ * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson
+ *
+ *
+ * Per Larsson a.k.a finalman
+ * Olof Naessén a.k.a jansem/yakslem
+ *
+ * Visit: http://guichan.sourceforge.net
+ *
+ * License: (BSD)
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Guichan nor the names of its contributors may
+ *    be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #ifndef RENDER_SDL2GRAPHICS_H
 #define RENDER_SDL2GRAPHICS_H
 
diff --git a/src/render/sdl2softwaregraphics.cpp b/src/render/sdl2softwaregraphics.cpp
index c158844ae..e78a87c7e 100644
--- a/src/render/sdl2softwaregraphics.cpp
+++ b/src/render/sdl2softwaregraphics.cpp
@@ -1126,7 +1126,7 @@ void SDL2SoftwareGraphics::_endDraw()
 
 bool SDL2SoftwareGraphics::pushClipArea(gcn::Rectangle area)
 {
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
 
     const gcn::ClipRectangle &carea = mClipStack.top();
     const SDL_Rect rect =
@@ -1142,7 +1142,7 @@ bool SDL2SoftwareGraphics::pushClipArea(gcn::Rectangle area)
 
 void SDL2SoftwareGraphics::popClipArea()
 {
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/render/sdlgraphics.cpp b/src/render/sdlgraphics.cpp
index 9e950c12f..2226be0da 100644
--- a/src/render/sdlgraphics.cpp
+++ b/src/render/sdlgraphics.cpp
@@ -1122,7 +1122,7 @@ void SDLGraphics::_endDraw()
 
 bool SDLGraphics::pushClipArea(gcn::Rectangle area)
 {
-    const bool result = gcn::Graphics::pushClipArea(area);
+    const bool result = Graphics::pushClipArea(area);
     const gcn::ClipRectangle &carea = mClipStack.top();
     const SDL_Rect rect =
     {
@@ -1138,7 +1138,7 @@ bool SDLGraphics::pushClipArea(gcn::Rectangle area)
 
 void SDLGraphics::popClipArea()
 {
-    gcn::Graphics::popClipArea();
+    Graphics::popClipArea();
 
     if (mClipStack.empty())
         return;
diff --git a/src/text.cpp b/src/text.cpp
index fdd538d72..a1ffea08c 100644
--- a/src/text.cpp
+++ b/src/text.cpp
@@ -40,7 +40,7 @@ int Text::mInstances = 0;
 ImageRect Text::mBubble;
 
 Text::Text(const std::string &text, const int x, const int y,
-           const gcn::Graphics::Alignment alignment,
+           const Graphics::Alignment alignment,
            const gcn::Color *const color, const bool isSpeech,
            gcn::Font *const font) :
     mFont(font ? font : (gui ? gui->getFont() : nullptr)),
@@ -78,13 +78,13 @@ Text::Text(const std::string &text, const int x, const int y,
 
     switch (alignment)
     {
-        case gcn::Graphics::LEFT:
+        case Graphics::LEFT:
             mXOffset = 0;
             break;
-        case gcn::Graphics::CENTER:
+        case Graphics::CENTER:
             mXOffset = mWidth / 2;
             break;
-        case gcn::Graphics::RIGHT:
+        case Graphics::RIGHT:
             mXOffset = mWidth;
             break;
         default:
@@ -151,7 +151,7 @@ void Text::draw(Graphics *const graphics, const int xOff, const int yOff)
 }
 
 FlashText::FlashText(const std::string &text, const int x, const int y,
-                     const gcn::Graphics::Alignment alignment,
+                     const Graphics::Alignment alignment,
                      const gcn::Color *const color, gcn::Font *const font) :
     Text(text, x, y, alignment, color, false, font),
     mTime(0)
diff --git a/src/text.h b/src/text.h
index ed980e588..b21ca51a7 100644
--- a/src/text.h
+++ b/src/text.h
@@ -30,6 +30,11 @@
 
 #include "localconsts.h"
 
+namespace gcn
+{
+    class Font;
+}
+
 class Text
 {
     friend class TextManager;
@@ -39,7 +44,7 @@ class Text
          * Constructor creates a text object to display on the screen.
          */
         Text(const std::string &text, const int x, const int y,
-             const gcn::Graphics::Alignment alignment,
+             const Graphics::Alignment alignment,
              const gcn::Color *const color, const bool isSpeech = false,
              gcn::Font *const font = nullptr);
 
@@ -90,7 +95,7 @@ class FlashText final : public Text
 {
     public:
         FlashText(const std::string &text, const int x, const int y,
-                  const gcn::Graphics::Alignment alignment,
+                  const Graphics::Alignment alignment,
                   const gcn::Color *const color,
                   gcn::Font *const font = nullptr);
 
-- 
cgit v1.2.3-70-g09d2