2 #include "drawing_context.h"
10 DrawingContext::DrawingContext()
14 DrawingContext::~DrawingContext()
19 DrawingContext::draw_surface(const Surface* surface, const Vector& position,
20 int layer, uint32_t drawing_effect)
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);
30 request.drawing_effect = drawing_effect;
32 drawingrequests.push_back(request);
36 DrawingContext::draw_surface_part(const Surface* surface, const Vector& source,
37 const Vector& size, const Vector& dest, int layer, uint32_t drawing_effect)
41 DrawingRequest request;
43 request.type = SURFACE_PART;
44 request.layer = layer;
45 request.pos = transform.apply(dest);
46 request.drawing_effect = drawing_effect;
48 SurfacePartRequest* surfacepartrequest = new SurfacePartRequest();
49 surfacepartrequest->size = size;
50 surfacepartrequest->source = source;
51 surfacepartrequest->surface = surface;
52 request.request_data = surfacepartrequest;
54 drawingrequests.push_back(request);
58 DrawingContext::draw_text(Font* font, const std::string& text,
59 const Vector& position, int layer)
61 DrawingRequest request;
64 request.layer = layer;
65 request.pos = transform.apply(position);
67 TextRequest* textrequest = new TextRequest;
68 textrequest->font = font;
69 textrequest->text = text;
70 request.request_data = textrequest;
72 drawingrequests.push_back(request);
76 DrawingContext::draw_text_center(Font* font, const std::string& text,
77 const Vector& position, int layer)
79 DrawingRequest request;
82 request.layer = layer;
83 request.pos = transform.apply(position) + Vector(screen->w/2 -
84 font->get_text_width(text)/2, 0);
86 TextRequest* textrequest = new TextRequest;
87 textrequest->font = font;
88 textrequest->text = text;
89 request.request_data = textrequest;
91 drawingrequests.push_back(request);
95 DrawingContext::draw_gradient(Color top, Color bottom, int layer)
97 DrawingRequest request;
99 request.type = GRADIENT;
100 request.layer = layer;
101 request.pos = Vector(0,0);
103 GradientRequest* gradientrequest = new GradientRequest;
104 gradientrequest->top = top;
105 gradientrequest->bottom = bottom;
106 request.request_data = gradientrequest;
108 drawingrequests.push_back(request);
112 DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size,
113 Color color, int layer)
115 DrawingRequest request;
117 request.type = FILLRECT;
118 request.layer = layer;
119 request.pos = topleft;
121 FillRectRequest* fillrectrequest = new FillRectRequest;
122 fillrectrequest->size = size;
123 fillrectrequest->color = color;
124 request.request_data = fillrectrequest;
126 drawingrequests.push_back(request);
130 DrawingContext::draw_surface_part(DrawingRequest& request)
132 SurfacePartRequest* surfacepartrequest
133 = (SurfacePartRequest*) request.request_data;
135 surfacepartrequest->surface->impl->draw_part(
136 surfacepartrequest->source.x, surfacepartrequest->source.y,
137 request.pos.x, request.pos.y,
138 surfacepartrequest->size.x, surfacepartrequest->size.y, 255,
139 request.drawing_effect);
141 delete surfacepartrequest;
145 DrawingContext::draw_gradient(DrawingRequest& request)
147 GradientRequest* gradientrequest = (GradientRequest*) request.request_data;
148 const Color& top = gradientrequest->top;
149 const Color& bottom = gradientrequest->bottom;
155 glColor3ub(top.red, top.green, top.blue);
157 glVertex2f(screen->w, 0);
158 glColor3ub(bottom.red, bottom.green, bottom.blue);
159 glVertex2f(screen->w, screen->h);
160 glVertex2f(0, screen->h);
166 float redstep = (float(bottom.red)-float(top.red)) / float(screen->h);
167 float greenstep = (float(bottom.green)-float(top.green)) / float(screen->h);
168 float bluestep = (float(bottom.blue) - float(top.blue)) / float(screen->h);
170 for(float y = 0; y < screen->h; y += 2)
171 fillrect(0, (int)y, screen->w, 2,
172 int(float(top.red) + redstep * y),
173 int(float(top.green) + greenstep * y),
174 int(float(top.blue) + bluestep * y), 255);
180 delete gradientrequest;
184 DrawingContext::draw_text(DrawingRequest& request)
186 TextRequest* textrequest = (TextRequest*) request.request_data;
188 textrequest->font->draw(textrequest->text, request.pos);
194 DrawingContext::draw_filled_rect(DrawingRequest& request)
196 FillRectRequest* fillrectrequest = (FillRectRequest*) request.request_data;
198 float x = request.pos.x;
199 float y = request.pos.y;
200 float w = fillrectrequest->size.x;
201 float h = fillrectrequest->size.y;
206 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
207 glColor4ub(fillrectrequest->color.red, fillrectrequest->color.green,
208 fillrectrequest->color.blue, fillrectrequest->color.alpha);
213 glVertex2f(x+w, y+h);
222 SDL_Surface *temp = NULL;
229 if(fillrectrequest->color.alpha != 255)
231 temp = SDL_CreateRGBSurface(screen->flags, rect.w, rect.h, screen->format->BitsPerPixel,
232 screen->format->Rmask,
233 screen->format->Gmask,
234 screen->format->Bmask,
235 screen->format->Amask);
243 SDL_FillRect(temp, &src, SDL_MapRGB(screen->format,
244 fillrectrequest->color.red, fillrectrequest->color.green,
245 fillrectrequest->color.blue));
247 SDL_SetAlpha(temp, SDL_SRCALPHA, fillrectrequest->color.alpha);
249 SDL_BlitSurface(temp,0,screen,&rect);
251 SDL_FreeSurface(temp);
254 SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format,
255 fillrectrequest->color.red, fillrectrequest->color.green,
256 fillrectrequest->color.blue));
263 delete fillrectrequest;
267 DrawingContext::do_drawing()
269 std::stable_sort(drawingrequests.begin(), drawingrequests.end());
271 for(DrawingRequests::iterator i = drawingrequests.begin();
272 i != drawingrequests.end(); ++i) {
276 const Surface* surface = (const Surface*) i->request_data;
277 surface->impl->draw(i->pos.x, i->pos.y, 255, i->drawing_effect);
281 draw_surface_part(*i);
290 draw_filled_rect(*i);
297 SDL_GL_SwapBuffers();
301 drawingrequests.clear();
305 DrawingContext::push_transform()
307 transformstack.push_back(transform);
311 DrawingContext::pop_transform()
313 assert(!transformstack.empty());
315 transform = transformstack.back();
316 transformstack.pop_back();