2 #include "drawing_context.h"
10 DrawingContext::DrawingContext()
14 DrawingContext::~DrawingContext()
19 DrawingContext::draw_surface(const Surface* surface, const Vector& position,
24 DrawingRequest request;
26 request.type = SURFACE;
27 request.layer = layer;
28 request.request_data = const_cast<Surface*> (surface);
29 request.pos = transform.apply(position);
31 drawingrequests.push_back(request);
35 DrawingContext::draw_surface_part(const Surface* surface, const Vector& source,
36 const Vector& size, const Vector& dest, int layer)
40 DrawingRequest request;
42 request.type = SURFACE_PART;
43 request.layer = layer;
44 request.pos = transform.apply(dest);
46 SurfacePartRequest* surfacepartrequest = new SurfacePartRequest();
47 surfacepartrequest->size = size;
48 surfacepartrequest->source = source;
49 surfacepartrequest->surface = surface;
50 request.request_data = surfacepartrequest;
52 drawingrequests.push_back(request);
56 DrawingContext::draw_text(Font* font, const std::string& text,
57 const Vector& position, int layer)
59 DrawingRequest request;
62 request.layer = layer;
63 request.pos = transform.apply(position);
65 TextRequest* textrequest = new TextRequest;
66 textrequest->font = font;
67 textrequest->text = text;
68 request.request_data = textrequest;
70 drawingrequests.push_back(request);
74 DrawingContext::draw_text_center(Font* font, const std::string& text,
75 const Vector& position, int layer)
77 DrawingRequest request;
80 request.layer = layer;
81 request.pos = transform.apply(position) + Vector(screen->w/2 -
82 font->get_text_width(text)/2, 0);
84 TextRequest* textrequest = new TextRequest;
85 textrequest->font = font;
86 textrequest->text = text;
87 request.request_data = textrequest;
89 drawingrequests.push_back(request);
93 DrawingContext::draw_gradient(Color top, Color bottom, int layer)
95 DrawingRequest request;
97 request.type = GRADIENT;
98 request.layer = layer;
99 request.pos = Vector(0,0);
101 GradientRequest* gradientrequest = new GradientRequest;
102 gradientrequest->top = top;
103 gradientrequest->bottom = bottom;
104 request.request_data = gradientrequest;
106 drawingrequests.push_back(request);
110 DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size,
111 Color color, int layer)
113 DrawingRequest request;
115 request.type = FILLRECT;
116 request.layer = layer;
117 request.pos = topleft;
119 FillRectRequest* fillrectrequest = new FillRectRequest;
120 fillrectrequest->size = size;
121 fillrectrequest->color = color;
122 request.request_data = fillrectrequest;
124 drawingrequests.push_back(request);
128 DrawingContext::draw_surface_part(DrawingRequest& request)
130 SurfacePartRequest* surfacepartrequest
131 = (SurfacePartRequest*) request.request_data;
133 surfacepartrequest->surface->impl->draw_part(
134 surfacepartrequest->source.x, surfacepartrequest->source.y,
135 request.pos.x, request.pos.y,
136 surfacepartrequest->size.x, surfacepartrequest->size.y, 255);
138 delete surfacepartrequest;
142 DrawingContext::draw_gradient(DrawingRequest& request)
144 GradientRequest* gradientrequest = (GradientRequest*) request.request_data;
145 const Color& top = gradientrequest->top;
146 const Color& bottom = gradientrequest->bottom;
152 glColor3ub(top.red, top.green, top.blue);
154 glVertex2f(screen->w, 0);
155 glColor3ub(bottom.red, bottom.green, bottom.blue);
156 glVertex2f(screen->w, screen->h);
157 glVertex2f(0, screen->h);
163 float redstep = (float(bottom.red)-float(top.red)) / float(screen->h);
164 float greenstep = (float(bottom.green)-float(top.green)) / float(screen->h);
165 float bluestep = (float(bottom.blue) - float(top.blue)) / float(screen->h);
167 for(float y = 0; y < screen->h; y += 2)
168 fillrect(0, (int)y, screen->w, 2,
169 int(float(top.red) + redstep * y),
170 int(float(top.green) + greenstep * y),
171 int(float(top.blue) + bluestep * y), 255);
177 delete gradientrequest;
181 DrawingContext::draw_text(DrawingRequest& request)
183 TextRequest* textrequest = (TextRequest*) request.request_data;
185 textrequest->font->draw(textrequest->text, request.pos);
191 DrawingContext::draw_filled_rect(DrawingRequest& request)
193 FillRectRequest* fillrectrequest = (FillRectRequest*) request.request_data;
195 float x = request.pos.x;
196 float y = request.pos.y;
197 float w = fillrectrequest->size.x;
198 float h = fillrectrequest->size.y;
203 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
204 glColor4ub(fillrectrequest->color.red, fillrectrequest->color.green,
205 fillrectrequest->color.blue, fillrectrequest->color.alpha);
210 glVertex2f(x+w, y+h);
219 SDL_Surface *temp = NULL;
226 if(fillrectrequest->color.alpha != 255)
228 temp = SDL_CreateRGBSurface(screen->flags, rect.w, rect.h, screen->format->BitsPerPixel,
229 screen->format->Rmask,
230 screen->format->Gmask,
231 screen->format->Bmask,
232 screen->format->Amask);
240 SDL_FillRect(temp, &src, SDL_MapRGB(screen->format,
241 fillrectrequest->color.red, fillrectrequest->color.green,
242 fillrectrequest->color.blue));
244 SDL_SetAlpha(temp, SDL_SRCALPHA, fillrectrequest->color.alpha);
246 SDL_BlitSurface(temp,0,screen,&rect);
248 SDL_FreeSurface(temp);
251 SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format,
252 fillrectrequest->color.red, fillrectrequest->color.green,
253 fillrectrequest->color.blue));
260 delete fillrectrequest;
264 DrawingContext::do_drawing()
266 std::stable_sort(drawingrequests.begin(), drawingrequests.end());
268 for(DrawingRequests::iterator i = drawingrequests.begin();
269 i != drawingrequests.end(); ++i) {
273 const Surface* surface = (const Surface*) i->request_data;
274 surface->impl->draw(i->pos.x, i->pos.y, 255);
278 draw_surface_part(*i);
287 draw_filled_rect(*i);
294 SDL_GL_SwapBuffers();
298 drawingrequests.clear();
302 DrawingContext::push_transform()
304 transformstack.push_back(transform);
308 DrawingContext::pop_transform()
310 assert(!transformstack.empty());
312 transform = transformstack.back();
313 transformstack.pop_back();