aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/guiscalingfilter.cpp49
-rw-r--r--src/client/guiscalingfilter.h8
2 files changed, 33 insertions, 24 deletions
diff --git a/src/client/guiscalingfilter.cpp b/src/client/guiscalingfilter.cpp
index de122becf..42508259f 100644
--- a/src/client/guiscalingfilter.cpp
+++ b/src/client/guiscalingfilter.cpp
@@ -176,52 +176,61 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr,
}
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
- const core::rect<s32> &rect, const core::rect<s32> &middle,
- const core::rect<s32> *cliprect, const video::SColor *const colors)
+ const core::rect<s32> &destrect, const core::rect<s32> &srcrect,
+ const core::rect<s32> &middlerect, const core::rect<s32> *cliprect,
+ const video::SColor *const colors)
{
- auto originalSize = texture->getOriginalSize();
- core::vector2di lowerRightOffset = core::vector2di(originalSize.Width, originalSize.Height) - middle.LowerRightCorner;
+ // `-x` is interpreted as `w - x`
+ core::rect<s32> middle = middlerect;
+
+ if (middlerect.LowerRightCorner.X < 0)
+ middle.LowerRightCorner.X += srcrect.getWidth();
+ if (middlerect.LowerRightCorner.Y < 0)
+ middle.LowerRightCorner.Y += srcrect.getHeight();
+
+ core::vector2di lower_right_offset = core::vector2di(srcrect.getWidth(),
+ srcrect.getHeight()) - middle.LowerRightCorner;
for (int y = 0; y < 3; ++y) {
for (int x = 0; x < 3; ++x) {
- core::rect<s32> src({0, 0}, originalSize);
- core::rect<s32> dest = rect;
+ core::rect<s32> src = srcrect;
+ core::rect<s32> dest = destrect;
switch (x) {
case 0:
- dest.LowerRightCorner.X = rect.UpperLeftCorner.X + middle.UpperLeftCorner.X;
- src.LowerRightCorner.X = middle.UpperLeftCorner.X;
+ dest.LowerRightCorner.X = destrect.UpperLeftCorner.X + middle.UpperLeftCorner.X;
+ src.LowerRightCorner.X = srcrect.UpperLeftCorner.X + middle.UpperLeftCorner.X;
break;
case 1:
dest.UpperLeftCorner.X += middle.UpperLeftCorner.X;
- dest.LowerRightCorner.X -= lowerRightOffset.X;
- src.UpperLeftCorner.X = middle.UpperLeftCorner.X;
- src.LowerRightCorner.X = middle.LowerRightCorner.X;
+ dest.LowerRightCorner.X -= lower_right_offset.X;
+ src.UpperLeftCorner.X += middle.UpperLeftCorner.X;
+ src.LowerRightCorner.X -= lower_right_offset.X;
break;
case 2:
- dest.UpperLeftCorner.X = rect.LowerRightCorner.X - lowerRightOffset.X;
- src.UpperLeftCorner.X = middle.LowerRightCorner.X;
+ dest.UpperLeftCorner.X = destrect.LowerRightCorner.X - lower_right_offset.X;
+ src.UpperLeftCorner.X = srcrect.LowerRightCorner.X - lower_right_offset.X;
break;
}
switch (y) {
case 0:
- dest.LowerRightCorner.Y = rect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y;
- src.LowerRightCorner.Y = middle.UpperLeftCorner.Y;
+ dest.LowerRightCorner.Y = destrect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y;
+ src.LowerRightCorner.Y = srcrect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y;
break;
case 1:
dest.UpperLeftCorner.Y += middle.UpperLeftCorner.Y;
- dest.LowerRightCorner.Y -= lowerRightOffset.Y;
- src.UpperLeftCorner.Y = middle.UpperLeftCorner.Y;
- src.LowerRightCorner.Y = middle.LowerRightCorner.Y;
+ dest.LowerRightCorner.Y -= lower_right_offset.Y;
+ src.UpperLeftCorner.Y += middle.UpperLeftCorner.Y;
+ src.LowerRightCorner.Y -= lower_right_offset.Y;
break;
case 2:
- dest.UpperLeftCorner.Y = rect.LowerRightCorner.Y - lowerRightOffset.Y;
- src.UpperLeftCorner.Y = middle.LowerRightCorner.Y;
+ dest.UpperLeftCorner.Y = destrect.LowerRightCorner.Y - lower_right_offset.Y;
+ src.UpperLeftCorner.Y = srcrect.LowerRightCorner.Y - lower_right_offset.Y;
break;
}
diff --git a/src/client/guiscalingfilter.h b/src/client/guiscalingfilter.h
index 379a4bdb0..f2d2fce10 100644
--- a/src/client/guiscalingfilter.h
+++ b/src/client/guiscalingfilter.h
@@ -46,13 +46,13 @@ video::ITexture *guiScalingImageButton(video::IVideoDriver *driver, video::IText
*/
void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr,
const core::rect<s32> &destrect, const core::rect<s32> &srcrect,
- const core::rect<s32> *cliprect = 0, const video::SColor *const colors = 0,
- bool usealpha = false);
+ const core::rect<s32> *cliprect = nullptr,
+ const video::SColor *const colors = nullptr, bool usealpha = false);
/*
* 9-slice / segment drawing
*/
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
- const core::rect<s32> &rect, const core::rect<s32> &middle,
- const core::rect<s32> *cliprect = nullptr,
+ const core::rect<s32> &destrect, const core::rect<s32> &srcrect,
+ const core::rect<s32> &middlerect, const core::rect<s32> *cliprect = nullptr,
const video::SColor *const colors = nullptr);