TGUI  0.8-dev
Clipping.hpp
1 //
3 // TGUI - Texus' Graphical User Interface
4 // Copyright (C) 2012-2017 Bruno Van de Velde (vdv_b@tgui.eu)
5 //
6 // This software is provided 'as-is', without any express or implied warranty.
7 // In no event will the authors be held liable for any damages arising from the use of this software.
8 //
9 // Permission is granted to anyone to use this software for any purpose,
10 // including commercial applications, and to alter it and redistribute it freely,
11 // subject to the following restrictions:
12 //
13 // 1. The origin of this software must not be misrepresented;
14 // you must not claim that you wrote the original software.
15 // If you use this software in a product, an acknowledgment
16 // in the product documentation would be appreciated but is not required.
17 //
18 // 2. Altered source versions must be plainly marked as such,
19 // and must not be misrepresented as being the original software.
20 //
21 // 3. This notice may not be removed or altered from any source distribution.
22 //
24 
25 
26 #ifndef TGUI_CLIPPING_HPP
27 #define TGUI_CLIPPING_HPP
28 
29 #include <TGUI/Global.hpp>
30 #include <SFML/Graphics/RenderTarget.hpp>
31 #include <SFML/Graphics/View.hpp>
32 #include <SFML/OpenGL.hpp>
33 
35 
36 namespace tgui
37 {
39 
40  class TGUI_API Clipping
41  {
42  public:
43 
53  Clipping(const sf::RenderTarget& target, const sf::RenderStates& states, sf::Vector2f topLeft, sf::Vector2f size)
54  {
55  const sf::Vector2i topLeftPosition = target.mapCoordsToPixel(states.transform.transformPoint(topLeft));
56  const sf::Vector2i bottomRightPosition = target.mapCoordsToPixel(states.transform.transformPoint(topLeft + size));
57 
58  // Get the old clipping area
59  glGetIntegerv(GL_SCISSOR_BOX, m_scissor);
60 
61  // Calculate the clipping area
62  const GLint scissorLeft = std::max(static_cast<GLint>(topLeftPosition.x), m_scissor[0]);
63  const GLint scissorBottom = std::min(static_cast<GLint>(bottomRightPosition.y), static_cast<GLint>(target.getSize().y) - m_scissor[1]);
64  GLint scissorTop = std::max(static_cast<GLint>(topLeftPosition.y), static_cast<GLint>(target.getSize().y) - m_scissor[1] - m_scissor[3]);
65  GLint scissorRight = std::min(static_cast<GLint>(bottomRightPosition.x), m_scissor[0] + m_scissor[2]);
66 
67  // If the object outside the window then don't draw anything
68  if (scissorRight < scissorLeft)
69  scissorRight = scissorLeft;
70  if (scissorBottom < scissorTop)
71  scissorTop = scissorBottom;
72 
73  // Set the clipping area
74  glScissor(scissorLeft, target.getSize().y - scissorBottom, scissorRight - scissorLeft, scissorBottom - scissorTop);
75  }
76 
78 
79  // The clipping object cannot be copied
80  Clipping(const Clipping& copy) = delete;
81  Clipping& operator=(const Clipping& right) = delete;
82 
84 
85  // When the clipping object is destroyed, the old clipping is restored
86  ~Clipping()
87  {
88  glScissor(m_scissor[0], m_scissor[1], m_scissor[2], m_scissor[3]);
89  };
90 
91 
93  private:
94 
95  GLint m_scissor[4] = {};
96  };
97 
99 }
100 
102 
103 #endif // TGUI_CLIPPING_HPP
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
Clipping(const sf::RenderTarget &target, const sf::RenderStates &states, sf::Vector2f topLeft, sf::Vector2f size)
Creates a clipping object which will define a clipping region until the object is destroyed...
Definition: Clipping.hpp:53
Definition: Clipping.hpp:40