a first implementation of doors to switch between sectors
[supertux.git] / src / screen / drawing_context.h
1 //  $Id$
2 //
3 //  SuperTux -  A Jump'n Run
4 //  Copyright (C) 2004 Matthias Braun <matze@braunis.de
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 #ifndef __DRAWINGCONTEXT_H__
20 #define __DRAWINGCONTEXT_H__
21
22 #include <stdint.h>
23 #include <vector>
24 #include <string>
25 #include "vector.h"
26 #include "screen.h"
27 #include <SDL.h>
28
29 class Surface;
30 class Font;
31
32 // some constants for predefined layer values
33 enum {
34   LAYER_BACKGROUND0 = -300,
35   LAYER_BACKGROUND1 = -200,
36   LAYER_BACKGROUNDTILES = -100,
37   LAYER_TILES = 0,
38   LAYER_OBJECTS = 100,
39   LAYER_FOREGROUNDTILES = 200,
40   LAYER_FOREGROUND0 = 300,
41   LAYER_FOREGROUND1 = 400
42 };
43
44 class Color
45 {
46 public:
47   Color() 
48     : red(0), green(0), blue(0), alpha(0)
49   {}
50   
51   Color(Uint8 red_, Uint8 green_, Uint8 blue_, Uint8 alpha_ = 0)
52     : red(red_), green(green_), blue(blue_), alpha(alpha_)
53   {}
54
55   Color(const Color& o)
56     : red(o.red), green(o.green), blue(o.blue), alpha(o.alpha)
57   { }
58
59   Uint8 red, green, blue, alpha;
60 };
61
62 /**
63  * This class provides functions for drawing things on screen. It also
64  * maintains a stack of transforms that are applied to graphics.
65  */
66 class DrawingContext
67 {
68 public:
69   DrawingContext();
70   ~DrawingContext();
71
72   /** Adds a drawing request for a surface into the request list */
73   void draw_surface(const Surface* surface, const Vector& position, int layer,
74       uint32_t drawing_effect = NONE_EFFECT);
75   /** Adds a drawing request for part of a surface */
76   void draw_surface_part(const Surface* surface, const Vector& source,
77       const Vector& size, const Vector& dest, int layer,
78       uint32_t drawing_effect = NONE_EFFECT);
79   /** draws a text */
80   void draw_text(Font* font, const std::string& text, const Vector& position,
81       int layer);
82   /** draws aligned text */
83   void draw_text_center(Font* font, const std::string& text,
84       const Vector& position, int layer);
85   /** draws a color gradient onto the whole screen */  
86   void draw_gradient(Color from, Color to, int layer);
87   /** fills a rectangle */
88   void draw_filled_rect(const Vector& topleft, const Vector& downright,
89           Color color, int layer);
90   
91   /** Processes all pending drawing requests and flushes the list */
92   void do_drawing();
93
94   const Vector& get_translation() const
95   { return transform.translation; }
96   void set_translation(const Vector& newtranslation)
97   { transform.translation = newtranslation; }
98
99   void push_transform();
100   void pop_transform();
101
102 private:
103   class Transform
104   {
105   public:
106     Vector translation; // only translation for now...
107
108     Vector apply(const Vector& v) const
109     {
110       return v - translation;
111     }
112   };
113
114   /// the transform stack
115   std::vector<Transform> transformstack;
116   /// the currently active transform
117   Transform transform;
118
119   enum RequestType
120   {
121     SURFACE, SURFACE_PART, TEXT, GRADIENT, FILLRECT
122   };
123
124   struct SurfacePartRequest
125   {
126     const Surface* surface;
127     Vector source, size;
128   };
129
130   struct TextRequest
131   {
132     Font* font;
133     std::string text;
134   };
135
136   struct GradientRequest
137   {
138     Color top, bottom;
139     Vector size;
140   };
141
142   struct FillRectRequest
143   {
144     Color color;
145     Vector size;
146   };
147
148   struct DrawingRequest
149   {
150     int layer;
151     uint32_t drawing_effect;
152
153     RequestType type;
154     Vector pos;
155
156     void* request_data;
157
158     bool operator<(const DrawingRequest& other) const
159     {
160       return layer < other.layer;
161     }
162   };
163
164   void draw_surface_part(DrawingRequest& request);
165   void draw_text(DrawingRequest& request);
166   void draw_gradient(DrawingRequest& request);
167   void draw_filled_rect(DrawingRequest& request);
168   
169   typedef std::vector<DrawingRequest> DrawingRequests;
170   DrawingRequests drawingrequests;
171 };
172
173 #endif
174