added jam build system, please try it out - the advantage would be that it already...
[supertux.git] / lib / video / drawing_context.cpp
index 0019ff5..1b35337 100644 (file)
@@ -16,6 +16,8 @@
 //  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>
@@ -29,7 +31,6 @@ 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*> (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);
 }
@@ -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,44 +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, int alpha)
+    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->center = false;
-  textrequest->alpha = alpha;
+  textrequest->allignment = allignment;
   request.request_data = textrequest;
 
   drawingrequests.push_back(request);
 }
 
 void
-DrawingContext::draw_text_center(Font* font, const std::string& text,
-    const Vector& position, int layer, Uint32 drawing_effect, int alpha)
+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);
-  request.drawing_effect = drawing_effect;
-
-  TextRequest* textrequest = new TextRequest;
-  textrequest->font = font;
-  textrequest->text = text;
-  textrequest->center = true;
-  textrequest->alpha = alpha;
-  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
@@ -124,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;
@@ -142,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;
@@ -162,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;
@@ -219,10 +240,7 @@ DrawingContext::draw_text(DrawingRequest& request)
 {
   TextRequest* textrequest = (TextRequest*) request.request_data;
 
-  if(textrequest->center)
-    textrequest->font->draw_center(textrequest->text, request.pos, request.drawing_effect, textrequest->alpha);
-  else
-    textrequest->font->draw(textrequest->text, request.pos, request.drawing_effect, textrequest->alpha);
+  textrequest->font->draw(textrequest->text, request.pos, textrequest->allignment, request.drawing_effect, request.alpha);
 
   delete textrequest;
 }
@@ -312,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:
@@ -357,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;
 }