summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map.cpp3
-rw-r--r--src/resources/ambientlayer.cpp27
-rw-r--r--src/resources/ambientlayer.h2
-rw-r--r--src/resources/resource.h2
-rw-r--r--src/sdlgraphics.cpp8
5 files changed, 27 insertions, 15 deletions
diff --git a/src/map.cpp b/src/map.cpp
index 1de22456..368b4e2a 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -252,6 +252,7 @@ void Map::initializeAmbientLayers()
ambientLayer->mSpeedX = getFloatProperty(name + "scrollX");
ambientLayer->mSpeedY = getFloatProperty(name + "scrollY");
ambientLayer->mMask = getIntProperty(name + "mask", 1);
+ ambientLayer->mKeepRatio = getBoolProperty(name + "keepratio");
list.push_back(ambientLayer);
@@ -501,7 +502,7 @@ void Map::drawAmbientLayers(Graphics *graphics, LayerType type,
if ((layer->mMask & mMask) == 0)
continue;
- layer->draw(graphics, graphics->getWidth(), graphics->getHeight());
+ layer->draw(graphics);
// Detail 1: only one overlay, higher: all overlays
if (detail == 1)
diff --git a/src/resources/ambientlayer.cpp b/src/resources/ambientlayer.cpp
index 2fa522e5..b292070b 100644
--- a/src/resources/ambientlayer.cpp
+++ b/src/resources/ambientlayer.cpp
@@ -21,7 +21,6 @@
#include "resources/ambientlayer.h"
#include "graphics.h"
-#include "video.h"
#include "resources/image.h"
#include "resources/resourcemanager.h"
@@ -30,8 +29,7 @@ AmbientLayer::AmbientLayer(Image *img)
: mImage(img)
{}
-AmbientLayer::~AmbientLayer()
-{}
+AmbientLayer::~AmbientLayer() = default;
void AmbientLayer::update(int timePassed, float dx, float dy)
{
@@ -58,14 +56,27 @@ void AmbientLayer::update(int timePassed, float dx, float dy)
mPosY += imgH;
}
-void AmbientLayer::draw(Graphics *graphics, int x, int y)
+void AmbientLayer::draw(Graphics *graphics)
{
+ const auto screenWidth = graphics->getWidth();
+ const auto screenHeight = graphics->getHeight();
+ const auto x = static_cast<int>(mPosX);
+ const auto y = static_cast<int>(mPosY);
+
if (!mKeepRatio)
+ {
graphics->drawImagePattern(mImage,
- (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY);
+ -x, -y,
+ screenWidth + x,
+ screenHeight + y);
+ }
else
+ {
graphics->drawRescaledImagePattern(mImage,
- (int) -mPosX, (int) -mPosY, x + (int) mPosX, y + (int) mPosY,
- (int) mImage->getWidth() / defaultScreenWidth * graphics->getWidth(),
- (int) mImage->getHeight() / defaultScreenHeight * graphics->getHeight());
+ -x, -y,
+ screenWidth + x,
+ screenHeight + y,
+ mImage->getWidth() * screenWidth / 800,
+ mImage->getHeight() * screenHeight / 600);
+ }
}
diff --git a/src/resources/ambientlayer.h b/src/resources/ambientlayer.h
index def2090b..e62af33f 100644
--- a/src/resources/ambientlayer.h
+++ b/src/resources/ambientlayer.h
@@ -39,7 +39,7 @@ class AmbientLayer
void update(int timePassed, float dx, float dy);
- void draw(Graphics *graphics, int x, int y);
+ void draw(Graphics *graphics);
float mParallax = 0; /**< Scroll factor based on camera position. */
float mSpeedX = 0; /**< Scrolling speed in X direction. */
diff --git a/src/resources/resource.h b/src/resources/resource.h
index 7f1f4836..9fe00f3d 100644
--- a/src/resources/resource.h
+++ b/src/resources/resource.h
@@ -59,7 +59,7 @@ class Resource
{ return mIdPath; }
protected:
- virtual ~Resource() {}
+ virtual ~Resource() = default;
private:
std::string mIdPath; /**< Path identifying this resource. */
diff --git a/src/sdlgraphics.cpp b/src/sdlgraphics.cpp
index b7f80fd2..3f6e809b 100644
--- a/src/sdlgraphics.cpp
+++ b/src/sdlgraphics.cpp
@@ -118,23 +118,23 @@ void SDLGraphics::drawRescaledImagePattern(Image *image,
if (scaledHeight <= 0 || scaledWidth <= 0)
return;
+ SDL_Rect srcRect;
+ srcRect.x = image->mBounds.x;
+ srcRect.y = image->mBounds.y;
+
for (int py = 0; py < h; py += scaledHeight) // Y position on pattern plane
{
int dh = (py + scaledHeight >= h) ? h - py : scaledHeight;
- int srcY = image->mBounds.y;
int dstY = y + py + mClipStack.top().yOffset;
for (int px = 0; px < w; px += scaledWidth) // X position on pattern plane
{
int dw = (px + scaledWidth >= w) ? w - px : scaledWidth;
- int srcX = image->mBounds.x;
int dstX = x + px + mClipStack.top().xOffset;
SDL_Rect dstRect;
- SDL_Rect srcRect;
dstRect.x = dstX; dstRect.y = dstY;
dstRect.w = dw; dstRect.h = dh;
- srcRect.x = srcX; srcRect.y = srcY;
srcRect.w = dw; srcRect.h = dh;
if (SDL_RenderCopy(mRenderer, image->mTexture, &srcRect, &dstRect))