diff --git a/src/sprite.cpp b/src/sprite.cpp index 760bb0b..7999546 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -134,12 +134,23 @@ struct SpritePrivate void onSrcRectChange() { - if (mirrored) - quad.setTexRect(srcRect->toFloatRect().hFlipped()); - else - quad.setTexRect(srcRect->toFloatRect()); + FloatRect rect = srcRect->toFloatRect(); + Vec2i bmSize; - quad.setPosRect(IntRect(0, 0, srcRect->width, srcRect->height)); + if (bitmap) + bmSize = Vec2i(bitmap->width(), bitmap->height()); + + if (mirrored) + rect = rect.hFlipped(); + + /* Clamp the rectangle so it doesn't reach outside + * the bitmap bounds */ + rect.w = clamp(rect.w, 0, bmSize.x-rect.x); + rect.h = clamp(rect.h, 0, bmSize.y-rect.y); + + quad.setTexRect(rect); + + quad.setPosRect(FloatRect(0, 0, rect.w, rect.h)); recomputeBushDepth(); wave.dirty = true;