From ec33551b24874073acbe592403934144c95ebac0 Mon Sep 17 00:00:00 2001 From: finicu212 <44416281+finicu212@users.noreply.github.com> Date: Tue, 30 Jun 2020 00:38:03 +0300 Subject: [PATCH] Fix #12021: Tie coords on gfx_draw_sprite_raw_masked_software (#12080) Make gfx_draw_sprite_raw_masked_software use ScreenCoordsXY object --- src/openrct2/drawing/Drawing.Sprite.cpp | 21 ++++++++++----------- src/openrct2/drawing/Drawing.h | 4 ++-- src/openrct2/drawing/X8DrawingEngine.cpp | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/openrct2/drawing/Drawing.Sprite.cpp b/src/openrct2/drawing/Drawing.Sprite.cpp index f8ba30664b..34c21d00da 100644 --- a/src/openrct2/drawing/Drawing.Sprite.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.cpp @@ -595,8 +595,8 @@ void FASTCALL gfx_sprite_to_buffer(DrawSpriteArgs& args) * * rct2: 0x00681DE2 */ -void FASTCALL - gfx_draw_sprite_raw_masked_software(rct_drawpixelinfo* dpi, int32_t x, int32_t y, int32_t maskImage, int32_t colourImage) +void FASTCALL gfx_draw_sprite_raw_masked_software( + rct_drawpixelinfo* dpi, const ScreenCoordsXY& scrCoords, int32_t maskImage, int32_t colourImage) { int32_t left, top, right, bottom, width, height; auto imgMask = gfx_get_g1_element(maskImage & 0x7FFFF); @@ -609,7 +609,7 @@ void FASTCALL // Only BMP format is supported for masking if (!(imgMask->flags & G1_FLAG_BMP) || !(imgColour->flags & G1_FLAG_BMP)) { - gfx_draw_sprite_software(dpi, ImageId::FromUInt32(colourImage), { x, y }); + gfx_draw_sprite_software(dpi, ImageId::FromUInt32(colourImage), scrCoords); return; } @@ -623,21 +623,20 @@ void FASTCALL width = std::min(imgMask->width, imgColour->width); height = std::min(imgMask->height, imgColour->height); - x += imgMask->x_offset; - y += imgMask->y_offset; + auto offsetCoords = scrCoords + ScreenCoordsXY{ imgMask->x_offset, imgMask->y_offset }; - left = std::max(dpi->x, x); - top = std::max(dpi->y, y); - right = std::min(dpi->x + dpi->width, x + width); - bottom = std::min(dpi->y + dpi->height, y + height); + left = std::max(dpi->x, offsetCoords.x); + top = std::max(dpi->y, offsetCoords.y); + right = std::min(dpi->x + dpi->width, offsetCoords.x + width); + bottom = std::min(dpi->y + dpi->height, offsetCoords.y + height); width = right - left; height = bottom - top; if (width < 0 || height < 0) return; - int32_t skipX = left - x; - int32_t skipY = top - y; + int32_t skipX = left - offsetCoords.x; + int32_t skipY = top - offsetCoords.y; uint8_t const* maskSrc = imgMask->offset + (skipY * imgMask->width) + skipX; uint8_t const* colourSrc = imgColour->offset + (skipY * imgColour->width) + skipX; diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index 680bf8d21b..21763318fc 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -637,8 +637,8 @@ void FASTCALL gfx_draw_sprite_solid(rct_drawpixelinfo* dpi, int32_t image, const void FASTCALL gfx_draw_sprite_software(rct_drawpixelinfo* dpi, ImageId imageId, const ScreenCoordsXY& spriteCoords); void FASTCALL gfx_draw_sprite_palette_set_software( rct_drawpixelinfo* dpi, ImageId imageId, const ScreenCoordsXY& coords, const PaletteMap& paletteMap); -void FASTCALL - gfx_draw_sprite_raw_masked_software(rct_drawpixelinfo* dpi, int32_t x, int32_t y, int32_t maskImage, int32_t colourImage); +void FASTCALL gfx_draw_sprite_raw_masked_software( + rct_drawpixelinfo* dpi, const ScreenCoordsXY& scrCoords, int32_t maskImage, int32_t colourImage); // string void gfx_draw_string(rct_drawpixelinfo* dpi, const_utf8string buffer, uint8_t colour, const ScreenCoordsXY& coords); diff --git a/src/openrct2/drawing/X8DrawingEngine.cpp b/src/openrct2/drawing/X8DrawingEngine.cpp index fb50bbb5a7..16feb1bda6 100644 --- a/src/openrct2/drawing/X8DrawingEngine.cpp +++ b/src/openrct2/drawing/X8DrawingEngine.cpp @@ -735,7 +735,7 @@ void X8DrawingContext::DrawSprite(uint32_t image, int32_t x, int32_t y, uint32_t void X8DrawingContext::DrawSpriteRawMasked(int32_t x, int32_t y, uint32_t maskImage, uint32_t colourImage) { - gfx_draw_sprite_raw_masked_software(_dpi, x, y, maskImage, colourImage); + gfx_draw_sprite_raw_masked_software(_dpi, { x, y }, maskImage, colourImage); } void X8DrawingContext::DrawSpriteSolid(uint32_t image, int32_t x, int32_t y, uint8_t colour)