diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp index 1f4c6443d6..feb0a198c3 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -69,8 +69,7 @@ private: int32_t _clipTop = 0; int32_t _clipRight = 0; int32_t _clipBottom = 0; - int32_t _spriteOffsetX = 0; - int32_t _spriteOffsetY = 0; + ScreenCoordsXY _spriteOffset; int32_t _drawCount = 0; @@ -695,10 +694,10 @@ void OpenGLDrawingContext::DrawSprite(uint32_t image, int32_t x, int32_t y, uint right = right / _dpi->zoom_level; bottom = bottom / _dpi->zoom_level; - left += _spriteOffsetX; - top += _spriteOffsetY; - right += _spriteOffsetX; - bottom += _spriteOffsetY; + left += _spriteOffset.x; + top += _spriteOffset.y; + right += _spriteOffset.x; + bottom += _spriteOffset.y; const auto texture = _textureCache->GetOrLoadImageTexture(image); @@ -807,10 +806,10 @@ void OpenGLDrawingContext::DrawSpriteRawMasked(int32_t x, int32_t y, uint32_t ma right = right * _dpi->zoom_level; bottom = bottom * _dpi->zoom_level; - left += _spriteOffsetX; - top += _spriteOffsetY; - right += _spriteOffsetX; - bottom += _spriteOffsetY; + left += _spriteOffset.x; + top += _spriteOffset.y; + right += _spriteOffset.x; + bottom += _spriteOffset.y; DrawRectCommand& command = _commandBuffers.rects.allocate(); @@ -911,10 +910,10 @@ void OpenGLDrawingContext::DrawGlyph(uint32_t image, int32_t x, int32_t y, const right = right / _dpi->zoom_level; bottom = bottom / _dpi->zoom_level; - left += _spriteOffsetX; - top += _spriteOffsetY; - right += _spriteOffsetX; - bottom += _spriteOffsetY; + left += _spriteOffset.x; + top += _spriteOffset.y; + right += _spriteOffset.x; + bottom += _spriteOffset.y; DrawRectCommand& command = _commandBuffers.rects.allocate(); @@ -1008,22 +1007,22 @@ void OpenGLDrawingContext::HandleTransparency() void OpenGLDrawingContext::SetDPI(rct_drawpixelinfo* dpi) { - rct_drawpixelinfo* screenDPI = _engine->GetDPI(); + auto screenDPI = _engine->GetDPI(); + auto bytesPerRow = screenDPI->GetBytesPerRow(); + auto bitsOffset = static_cast(dpi->bits - screenDPI->bits); # ifndef NDEBUG - size_t bitsSize = static_cast(screenDPI->height) * static_cast(screenDPI->width + screenDPI->pitch); -# endif - size_t bitsOffset = static_cast(dpi->bits - screenDPI->bits); - + auto bitsSize = static_cast(screenDPI->height) * bytesPerRow; assert(bitsOffset < bitsSize); +# endif - _clipLeft = static_cast(bitsOffset % (screenDPI->width + screenDPI->pitch)) + dpi->remX; - _clipTop = static_cast(bitsOffset / (screenDPI->width + screenDPI->pitch)) + dpi->remY; + _clipLeft = static_cast(bitsOffset % bytesPerRow) + dpi->remX; + _clipTop = static_cast(bitsOffset / bytesPerRow) + dpi->remY; _clipRight = _clipLeft + (dpi->width / dpi->zoom_level); _clipBottom = _clipTop + (dpi->height / dpi->zoom_level); _offsetX = _clipLeft - dpi->x; _offsetY = _clipTop - dpi->y; - _spriteOffsetX = _clipLeft - dpi->remX; - _spriteOffsetY = _clipTop - dpi->remY; + _spriteOffset.x = _clipLeft - dpi->remX; + _spriteOffset.y = _clipTop - dpi->remY; _dpi = dpi; } diff --git a/src/openrct2/drawing/Drawing.cpp b/src/openrct2/drawing/Drawing.cpp index 885b8cd090..9545a2022a 100644 --- a/src/openrct2/drawing/Drawing.cpp +++ b/src/openrct2/drawing/Drawing.cpp @@ -773,14 +773,24 @@ std::optional GetPaletteMapForColour(colour_t paletteId) return std::nullopt; } -rct_drawpixelinfo rct_drawpixelinfo::Crop(int32_t newX, int32_t newY, int32_t newWidth, int32_t newHeight) +size_t rct_drawpixelinfo::GetBytesPerRow() const +{ + return static_cast(width) + pitch; +} + +uint8_t* rct_drawpixelinfo::GetBitsOffset(const ScreenCoordsXY& pos) const +{ + return bits + pos.x + (pos.y * GetBytesPerRow()); +} + +rct_drawpixelinfo rct_drawpixelinfo::Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const { rct_drawpixelinfo result = *this; - result.bits = bits + newX + (((size_t)width + pitch) * newY); - result.x = static_cast(newX); - result.y = static_cast(newY); - result.width = static_cast(newWidth); - result.height = static_cast(newHeight); - result.pitch = static_cast(width + pitch - newWidth); + result.bits = GetBitsOffset(pos); + result.x = static_cast(pos.x); + result.y = static_cast(pos.y); + result.width = static_cast(size.width); + result.height = static_cast(size.height); + result.pitch = static_cast(width + pitch - size.width); return result; } diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index d54ce247f3..a6a0a6e768 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -13,6 +13,7 @@ #include "../common.h" #include "../interface/Colour.h" #include "../interface/ZoomLevel.hpp" +#include "../world/Location.hpp" #include "Text.h" #include @@ -114,7 +115,9 @@ struct rct_drawpixelinfo OpenRCT2::Drawing::IDrawingEngine* DrawingEngine{}; - rct_drawpixelinfo Crop(int32_t newX, int32_t newY, int32_t newWidth, int32_t newHeight); + size_t GetBytesPerRow() const; + uint8_t* GetBitsOffset(const ScreenCoordsXY& pos) const; + rct_drawpixelinfo Crop(const ScreenCoordsXY& pos, const ScreenSize& size) const; }; struct rct_g1_element_32bit diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 7db1cd7f29..ad8b7a6bf2 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -2019,7 +2019,7 @@ bool window_is_visible(rct_window* w) */ void window_draw_all(rct_drawpixelinfo* dpi, int16_t left, int16_t top, int16_t right, int16_t bottom) { - auto windowDPI = dpi->Crop(left, top, right - left, bottom - top); + auto windowDPI = dpi->Crop({ left, top }, { right - left, bottom - top }); window_visit_each([&windowDPI, left, top, right, bottom](rct_window* w) { if (w->flags & WF_TRANSPARENT) return;