X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fbackground.cpp;h=f49e05c62875dd22f9f575a21aff2f4bbb157931;hb=f2ffe3ee4a4955232ac311c661f98e11d2daa155;hp=78aebf2fbd537aa98854939ed6871a1636632c9e;hpb=a7655ce3981d2136fb72ddf2e1ef6156655e3c10;p=supertux.git diff --git a/src/object/background.cpp b/src/object/background.cpp index 78aebf2fb..f49e05c62 100644 --- a/src/object/background.cpp +++ b/src/object/background.cpp @@ -17,6 +17,9 @@ #include "object/background.hpp" #include +#include +#include + #include "math/sizef.hpp" #include "supertux/globals.hpp" #include "supertux/object_factory.hpp" @@ -24,8 +27,6 @@ #include "util/log.hpp" #include "util/reader.hpp" -#include - Background::Background() : alignment(NO_ALIGNMENT), layer(LAYER_BACKGROUND0), @@ -148,17 +149,17 @@ Background::draw_image(DrawingContext& context, const Vector& pos) Sizef level(Sector::current()->get_width(), Sector::current()->get_height()); Sizef screen(SCREEN_WIDTH, SCREEN_HEIGHT); Sizef parallax_image_size = (1.0f - speed) * screen + level * speed; + Rectf cliprect = context.get_cliprect(); - // FIXME: Implement proper clipping here - int start_x = -parallax_image_size.width / 2.0f / image->get_width() - 1; - int end_x = parallax_image_size.width / 2.0f / image->get_width() + 1; - int start_y = -parallax_image_size.height / 2.0f / image->get_height() - 1; - int end_y = parallax_image_size.height / 2.0f / image->get_height() + 1; + int start_x = static_cast(floorf((cliprect.get_left() - (pos.x - image->get_width() /2.0f)) / image->get_width())); + int end_x = static_cast(ceilf((cliprect.get_right() - (pos.x + image->get_width() /2.0f)) / image->get_width()))+1; + int start_y = static_cast(floorf((cliprect.get_top() - (pos.y - image->get_height()/2.0f)) / image->get_height())); + int end_y = static_cast(ceilf((cliprect.get_bottom() - (pos.y + image->get_height()/2.0f)) / image->get_height()))+1; switch(alignment) { case LEFT_ALIGNMENT: - for(int y = start_y; y <= end_y; ++y) + for(int y = start_y; y < end_y; ++y) { Vector p(pos.x - parallax_image_size.width / 2.0f, pos.y + y * image->get_height() - image->get_height() / 2.0f); @@ -167,7 +168,7 @@ Background::draw_image(DrawingContext& context, const Vector& pos) break; case RIGHT_ALIGNMENT: - for(int y = start_y; y <= end_y; ++y) + for(int y = start_y; y < end_y; ++y) { Vector p(pos.x + parallax_image_size.width / 2.0f - image->get_width(), pos.y + y * image->get_height() - image->get_height() / 2.0f); @@ -176,28 +177,28 @@ Background::draw_image(DrawingContext& context, const Vector& pos) break; case TOP_ALIGNMENT: - for(int x = start_x; x <= end_x; ++x) + for(int x = start_x; x < end_x; ++x) { - Vector p(pos.x + x * image->get_width() - image->get_width() / 2.0f, - pos.y - parallax_image_size.height / 2.0f); + Vector p(pos.x + x * image->get_width() - image->get_width() / 2.0f, + pos.y - parallax_image_size.height / 2.0f); context.draw_surface(image, p, layer); } break; case BOTTOM_ALIGNMENT: - for(int x = start_x; x <= end_x; ++x) + for(int x = start_x; x < end_x; ++x) { - Vector p(pos.x + x * image->get_width() - image->get_width() / 2.0f, - pos.y - image->get_height() + parallax_image_size.height / 2.0f); + Vector p(pos.x + x * image->get_width() - image->get_width() / 2.0f, + pos.y - image->get_height() + parallax_image_size.height / 2.0f); context.draw_surface(image, p, layer); } break; case NO_ALIGNMENT: - for(int y = start_y; y <= end_y; ++y) - for(int x = start_x; x <= end_x; ++x) + for(int y = start_y; y < end_y; ++y) + for(int x = start_x; x < end_x; ++x) { - Vector p(pos.x + x * image->get_width() - image->get_width()/2, + Vector p(pos.x + x * image->get_width() - image->get_width()/2, pos.y + y * image->get_height() - image->get_height()/2); if (image_top.get() != NULL && (y < 0)) @@ -227,7 +228,7 @@ Background::draw(DrawingContext& context) Sector::current()->get_height()); Sizef screen(SCREEN_WIDTH, SCREEN_HEIGHT); Sizef translation_range = level_size - screen; - Vector center_offset(context.get_translation().x - translation_range.width / 2.0f, + Vector center_offset(context.get_translation().x - translation_range.width / 2.0f, context.get_translation().y - translation_range.height / 2.0f); // FIXME: We are not handling 'pos'