X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fvideo%2Fdrawing_context.cpp;h=bba6d36c289269b41166b18e5fd70fc55ca65053;hb=133d94d5b145f325c38c8c15c9ea561bfffb092d;hp=6a6b75369a02175e06b1f74cdaf7a9ffe0285250;hpb=edaacb3651cf0560314dd008d7243be4b3b2f8c6;p=supertux.git diff --git a/lib/video/drawing_context.cpp b/lib/video/drawing_context.cpp index 6a6b75369..bba6d36c2 100644 --- a/lib/video/drawing_context.cpp +++ b/lib/video/drawing_context.cpp @@ -16,20 +16,21 @@ // You should have received a copy of the GNU General Public License // 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 "video/drawing_context.h" -#include "video/surface.h" +#include "drawing_context.h" +#include "surface.h" #include "app/globals.h" -#include "video/font.h" +#include "font.h" using namespace SuperTux; DrawingContext::DrawingContext() { -transform.draw_effect = NONE_EFFECT; } DrawingContext::~DrawingContext() @@ -45,11 +46,17 @@ DrawingContext::draw_surface(const Surface* surface, const Vector& position, DrawingRequest request; request.type = SURFACE; - request.layer = layer; - request.request_data = const_cast (surface); request.pos = transform.apply(position); - request.drawing_effect = drawing_effect; - request.drawing_effect = transform.draw_effect | drawing_effect; + + if(request.pos.x >= screen->w || request.pos.y >= screen->h + || request.pos.x + surface->w < 0 || request.pos.y + surface->h < 0) + return; + + request.layer = layer; + request.drawing_effect = transform.drawing_effect | drawing_effect; + request.zoom = transform.zoom; + request.alpha = transform.alpha; + request.request_data = const_cast (surface); drawingrequests.push_back(request); } @@ -63,14 +70,31 @@ DrawingContext::draw_surface_part(const Surface* surface, const Vector& source, DrawingRequest request; request.type = SURFACE_PART; - request.layer = layer; request.pos = transform.apply(dest); - request.drawing_effect = drawing_effect; + request.layer = layer; + request.drawing_effect = transform.drawing_effect | drawing_effect; + request.alpha = transform.alpha; SurfacePartRequest* surfacepartrequest = new SurfacePartRequest(); surfacepartrequest->size = size; surfacepartrequest->source = source; surfacepartrequest->surface = surface; + + // clip on screen borders + if(request.pos.x < 0) { + surfacepartrequest->size.x += request.pos.x; + if(surfacepartrequest->size.x <= 0) + return; + surfacepartrequest->source.x -= request.pos.x; + request.pos.x = 0; + } + if(request.pos.y < 0) { + surfacepartrequest->size.y += request.pos.y; + if(surfacepartrequest->size.y <= 0) + return; + surfacepartrequest->source.y -= request.pos.y; + request.pos.y = 0; + } request.request_data = surfacepartrequest; drawingrequests.push_back(request); @@ -78,41 +102,33 @@ DrawingContext::draw_surface_part(const Surface* surface, const Vector& source, void DrawingContext::draw_text(Font* font, const std::string& text, - const Vector& position, int layer, Uint32 drawing_effect) + const Vector& position, int allignment, int layer, + Uint32 drawing_effect) { DrawingRequest request; request.type = TEXT; - request.layer = layer; request.pos = transform.apply(position); - request.drawing_effect = drawing_effect; + request.layer = layer; + request.drawing_effect = transform.drawing_effect | drawing_effect; + request.zoom = transform.zoom; + request.alpha = transform.alpha; TextRequest* textrequest = new TextRequest; textrequest->font = font; textrequest->text = text; + textrequest->allignment = allignment; request.request_data = textrequest; drawingrequests.push_back(request); } void -DrawingContext::draw_text_center(Font* font, const std::string& text, +DrawingContext::draw_center_text(Font* font, const std::string& text, const Vector& position, int layer, Uint32 drawing_effect) { - DrawingRequest request; - - request.type = TEXT; - request.layer = layer; - request.pos = transform.apply(position) + Vector(screen->w/2 - - font->get_text_width(text)/2, 0); - request.drawing_effect = drawing_effect; - - TextRequest* textrequest = new TextRequest; - textrequest->font = font; - textrequest->text = text; - request.request_data = textrequest; - - drawingrequests.push_back(request); +draw_text(font, text, Vector(position.x + screen->w/2, position.y), + CENTER_ALLIGN, layer, drawing_effect); } void @@ -121,8 +137,12 @@ DrawingContext::draw_gradient(Color top, Color bottom, int layer) DrawingRequest request; request.type = GRADIENT; - request.layer = layer; request.pos = Vector(0,0); + request.layer = layer; + + request.drawing_effect = transform.drawing_effect; + request.zoom = transform.zoom; + request.alpha = transform.alpha; GradientRequest* gradientrequest = new GradientRequest; gradientrequest->top = top; @@ -139,8 +159,12 @@ DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size, DrawingRequest request; request.type = FILLRECT; - request.layer = layer; request.pos = transform.apply(topleft); + request.layer = layer; + + request.drawing_effect = transform.drawing_effect; + request.zoom = transform.zoom; + request.alpha = transform.alpha; FillRectRequest* fillrectrequest = new FillRectRequest; fillrectrequest->size = size; @@ -159,7 +183,7 @@ DrawingContext::draw_surface_part(DrawingRequest& request) surfacepartrequest->surface->impl->draw_part( surfacepartrequest->source.x, surfacepartrequest->source.y, request.pos.x, request.pos.y, - surfacepartrequest->size.x, surfacepartrequest->size.y, 255, + surfacepartrequest->size.x, surfacepartrequest->size.y, request.alpha, request.drawing_effect); delete surfacepartrequest; @@ -215,8 +239,8 @@ void DrawingContext::draw_text(DrawingRequest& request) { TextRequest* textrequest = (TextRequest*) request.request_data; - - textrequest->font->draw(textrequest->text, request.pos, request.drawing_effect); + + textrequest->font->draw(textrequest->text, request.pos, textrequest->allignment, request.drawing_effect, request.alpha); delete textrequest; } @@ -306,7 +330,13 @@ DrawingContext::do_drawing() case SURFACE: { const Surface* surface = (const Surface*) i->request_data; - surface->impl->draw(i->pos.x, i->pos.y, 255, i->drawing_effect); + + if(i->zoom != 1.0) + surface->impl->draw_stretched(i->pos.x * i->zoom, i->pos.y * i->zoom, + (int)(surface->w * i->zoom), (int)(surface->h * i->zoom), + i->alpha, i->drawing_effect); + else + surface->impl->draw(i->pos.x, i->pos.y, i->alpha, i->drawing_effect); break; } case SURFACE_PART: @@ -351,5 +381,17 @@ DrawingContext::pop_transform() void DrawingContext::set_drawing_effect(int effect) { - transform.draw_effect = effect; + transform.drawing_effect = effect; +} + +void +DrawingContext::set_zooming(float zoom) +{ + transform.zoom = zoom; +} + +void +DrawingContext::set_alpha(int alpha) +{ + transform.alpha = alpha; }