TGUI  0.7.4
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 
52  Clipping(const sf::RenderTarget& target, const sf::RenderStates& states, sf::Vector2f topLeft, sf::Vector2f size)
53  {
54  sf::Vector2i topLeftPosition = target.mapCoordsToPixel(states.transform.transformPoint(topLeft));
55  sf::Vector2i bottomRightPosition = target.mapCoordsToPixel(states.transform.transformPoint(topLeft + size));
56 
57  // Get the old clipping area
58  glGetIntegerv(GL_SCISSOR_BOX, m_scissor);
59 
60  // Calculate the clipping area
61  GLint scissorLeft = std::max(static_cast<GLint>(topLeftPosition.x), m_scissor[0]);
62  GLint scissorTop = std::max(static_cast<GLint>(topLeftPosition.y), static_cast<GLint>(target.getSize().y) - m_scissor[1] - m_scissor[3]);
63  GLint scissorRight = std::min(static_cast<GLint>(bottomRightPosition.x), m_scissor[0] + m_scissor[2]);
64  GLint scissorBottom = std::min(static_cast<GLint>(bottomRightPosition.y), static_cast<GLint>(target.getSize().y) - m_scissor[1]);
65 
66  // If the object outside the window then don't draw anything
67  if (scissorRight < scissorLeft)
68  scissorRight = scissorLeft;
69  else if (scissorBottom < scissorTop)
70  scissorTop = scissorBottom;
71 
72  // Set the clipping area
73  glScissor(scissorLeft, target.getSize().y - scissorBottom, scissorRight - scissorLeft, scissorBottom - scissorTop);
74  }
75 
77 
78  // The clipping object cannot be copied
79  Clipping(const Clipping& copy) = delete;
80  Clipping& operator=(const Clipping& right) = delete;
81 
83 
84  // When the clipping object is destroyed, the old clipping is restored
85  ~Clipping()
86  {
87  glScissor(m_scissor[0], m_scissor[1], m_scissor[2], m_scissor[3]);
88  };
89 
90 
92  private:
93 
94  GLint m_scissor[4];
95  };
96 
98 }
99 
101 
102 #endif // TGUI_CLIPPING_HPP
Namespace that contains all TGUI functions and classes.
Definition: Animation.hpp:33
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:52
Definition: Clipping.hpp:40