1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 
17 #include "video/drawing_context.hpp"
18 
19 #include <algorithm>
20 
21 #include "supertux/globals.hpp"
22 #include "util/obstackpp.hpp"
23 #include "video/drawing_request.hpp"
24 #include "video/renderer.hpp"
25 #include "video/surface.hpp"
26 #include "video/video_system.hpp"
27 #include "video/viewport.hpp"
28 
DrawingContext(VideoSystem & video_system_,obstack & obst,bool overlay)29 DrawingContext::DrawingContext(VideoSystem& video_system_, obstack& obst, bool overlay) :
30   m_video_system(video_system_),
31   m_obst(obst),
32   m_overlay(overlay),
33   m_viewport(0, 0,
34              m_video_system.get_viewport().get_screen_width(),
35              m_video_system.get_viewport().get_screen_height()),
36   m_ambient_color(Color::WHITE),
37   m_transform_stack(1),
38   m_colormap_canvas(*this, m_obst),
39   m_lightmap_canvas(*this, m_obst)
40 {
41 }
42 
~DrawingContext()43 DrawingContext::~DrawingContext()
44 {
45   clear();
46 }
47 
48 void
set_ambient_color(Color ambient_color)49 DrawingContext::set_ambient_color(Color ambient_color)
50 {
51   m_ambient_color = ambient_color;
52 }
53 
54 Rectf
get_cliprect() const55 DrawingContext::get_cliprect() const
56 {
57   return Rectf(get_translation().x,
58                get_translation().y,
59                get_translation().x + static_cast<float>(m_viewport.get_width()) / transform().scale,
60                get_translation().y + static_cast<float>(m_viewport.get_height()) / transform().scale);
61 }
62 
63 void
set_flip(Flip flip)64 DrawingContext::set_flip(Flip flip)
65 {
66   transform().flip = flip;
67 }
68 
69 Flip
get_flip() const70 DrawingContext::get_flip() const
71 {
72   return transform().flip;
73 }
74 
75 void
set_alpha(float alpha)76 DrawingContext::set_alpha(float alpha)
77 {
78   transform().alpha = alpha;
79 }
80 
81 float
get_alpha() const82 DrawingContext::get_alpha() const
83 {
84   return transform().alpha;
85 }
86 
87 DrawingTransform&
transform()88 DrawingContext::transform()
89 {
90   assert(!m_transform_stack.empty());
91   return m_transform_stack.back();
92 }
93 
94 const DrawingTransform&
transform() const95 DrawingContext::transform() const
96 {
97   assert(!m_transform_stack.empty());
98   return m_transform_stack.back();
99 }
100 
101 void
push_transform()102 DrawingContext::push_transform()
103 {
104   m_transform_stack.push_back(transform());
105 }
106 
107 void
pop_transform()108 DrawingContext::pop_transform()
109 {
110   m_transform_stack.pop_back();
111   assert(!m_transform_stack.empty());
112 }
113 
114 const Rect
get_viewport() const115 DrawingContext::get_viewport() const
116 {
117   Rect tmp(
118     static_cast<int>(static_cast<float>(m_viewport.left) / transform().scale),
119     static_cast<int>(static_cast<float>(m_viewport.top) / transform().scale),
120     static_cast<int>(static_cast<float>(m_viewport.right) / transform().scale),
121     static_cast<int>(static_cast<float>(m_viewport.bottom) / transform().scale)
122   );
123 
124   return m_viewport;
125 }
126 
127 int
get_width() const128 DrawingContext::get_width() const
129 {
130   return static_cast<int>(static_cast<float>(m_viewport.get_width()) / transform().scale);
131 }
132 
133 int
get_height() const134 DrawingContext::get_height() const
135 {
136   return static_cast<int>(static_cast<float>(m_viewport.get_height()) / transform().scale);
137 }
138 
139 Vector
get_size() const140 DrawingContext::get_size() const
141 {
142   return Vector(static_cast<float>(get_width()), static_cast<float>(get_height())) * transform().scale;
143 }
144 
145 /* EOF */
146