// 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 <config.h>
+
#include <algorithm>
#include <cassert>
#include <iostream>
-#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()
DrawingRequest request;
request.type = SURFACE;
- request.layer = layer;
- request.request_data = const_cast<Surface*> (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*> (surface);
drawingrequests.push_back(request);
}
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);
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
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;
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;
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;
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;
}
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:
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;
}