X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.cpp;h=b75b95048adf277309285c043461ef5e967d1e05;hb=216e6b44cf103d10383c0e0f6587afafc7454b94;hp=02712fd10d998813c12f72b7953b25b1fbdc129c;hpb=9e7e803e384ed7bf0f5ccf9a4c381dd13b6a01d1;p=supertux.git diff --git a/src/video/drawing_context.cpp b/src/video/drawing_context.cpp index 02712fd10..b75b95048 100644 --- a/src/video/drawing_context.cpp +++ b/src/video/drawing_context.cpp @@ -17,17 +17,10 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include - -#include #include -#include -#include -#include -#include -#include -#include #include "drawing_context.hpp" + #include "drawing_request.hpp" #include "video_systems.hpp" #include "renderer.hpp" @@ -152,7 +145,7 @@ DrawingContext::draw_surface_part(const Surface* surface, const Vector& source, void DrawingContext::draw_text(const Font* font, const std::string& text, - const Vector& position, FontAlignment alignment, int layer) + const Vector& position, FontAlignment alignment, int layer, Color color) { DrawingRequest* request = new(obst) DrawingRequest(); @@ -162,6 +155,7 @@ DrawingContext::draw_text(const Font* font, const std::string& text, request->layer = layer; request->drawing_effect = transform.drawing_effect; request->alpha = transform.alpha; + request->color = color; TextRequest* textrequest = new(obst) TextRequest(); textrequest->font = font; @@ -174,10 +168,10 @@ DrawingContext::draw_text(const Font* font, const std::string& text, void DrawingContext::draw_center_text(const Font* font, const std::string& text, - const Vector& position, int layer) + const Vector& position, int layer, Color color) { draw_text(font, text, Vector(position.x + SCREEN_WIDTH/2, position.y), - ALIGN_CENTER, layer); + ALIGN_CENTER, layer, color); } void @@ -256,6 +250,29 @@ DrawingContext::draw_filled_rect(const Rect& rect, const Color& color, float rad } void +DrawingContext::draw_inverse_ellipse(const Vector& pos, const Vector& size, const Color& color, int layer) +{ + DrawingRequest* request = new(obst) DrawingRequest(); + + request->target = target; + request->type = INVERSEELLIPSE; + request->pos = transform.apply(pos); + request->layer = layer; + + request->drawing_effect = transform.drawing_effect; + request->alpha = transform.alpha; + + InverseEllipseRequest* ellipse = new(obst)InverseEllipseRequest; + + ellipse->color = color; + ellipse->color.alpha = color.alpha * transform.alpha; + ellipse->size = size; + request->request_data = ellipse; + + requests->push_back(request); +} + +void DrawingContext::get_light(const Vector& position, Color* color) { if( ambient_color.red == 1.0f && ambient_color.green == 1.0f @@ -302,12 +319,17 @@ DrawingContext::do_drawing() lightmap->start_draw(ambient_color); handle_drawing_requests(lightmap_requests); lightmap->end_draw(); + + DrawingRequest* request = new(obst) DrawingRequest(); + request->target = NORMAL; + request->type = DRAW_LIGHTMAP; + request->layer = LAYER_HUD - 1; + drawing_requests.push_back(request); } + lightmap_requests.clear(); handle_drawing_requests(drawing_requests); - if(use_lightmap) { - lightmap->do_draw(); - } + drawing_requests.clear(); obstack_free(&obst, NULL); obstack_init(&obst); @@ -357,12 +379,18 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) { const TextRequest* textrequest = (TextRequest*) request.request_data; textrequest->font->draw(renderer, textrequest->text, request.pos, - textrequest->alignment, request.drawing_effect, request.alpha); + textrequest->alignment, request.drawing_effect, request.color, request.alpha); } break; case FILLRECT: renderer->draw_filled_rect(request); break; + case INVERSEELLIPSE: + renderer->draw_inverse_ellipse(request); + break; + case DRAW_LIGHTMAP: + lightmap->do_draw(); + break; case GETLIGHT: lightmap->get_light(request); break; @@ -383,12 +411,18 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) { const TextRequest* textrequest = (TextRequest*) request.request_data; textrequest->font->draw(renderer, textrequest->text, request.pos, - textrequest->alignment, request.drawing_effect, request.alpha); + textrequest->alignment, request.drawing_effect, request.color, request.alpha); } break; case FILLRECT: lightmap->draw_filled_rect(request); break; + case INVERSEELLIPSE: + assert(!"InverseEllipse doesn't make sense on the lightmap"); + break; + case DRAW_LIGHTMAP: + lightmap->do_draw(); + break; case GETLIGHT: lightmap->get_light(request); break; @@ -396,7 +430,6 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) break; } } - requests.clear(); } void