diff --git a/src/emu/rendersw.hxx b/src/emu/rendersw.hxx index aa7b225379529..5561928e7df9e 100644 --- a/src/emu/rendersw.hxx +++ b/src/emu/rendersw.hxx @@ -153,7 +153,10 @@ private: } else { - u16 const *const texbase = reinterpret_cast(texture.base) + (curv >> 16) * texture.rowpixels + (curu >> 16); + s32 u = std::clamp(curu >> 16, 0, texture.width - 1); + s32 v = std::clamp(curv >> 16, 0, texture.height - 1); + + u16 const *const texbase = reinterpret_cast(texture.base) + v * texture.rowpixels + u; return palbase[texbase[0]]; } } @@ -185,7 +188,10 @@ private: } else { - u16 const *const texbase = reinterpret_cast(texture.base) + (curv >> 16) * texture.rowpixels + (curu >> 16); + s32 u = std::clamp(curu >> 16, 0, texture.width - 1); + s32 v = std::clamp(curv >> 16, 0, texture.height - 1); + + u16 const *const texbase = reinterpret_cast(texture.base) + v * texture.rowpixels + u; return palbase[texbase[0]]; } } @@ -247,8 +253,11 @@ private: } else { - const u16 *texbase = reinterpret_cast(texture.base) + (curv >> 16) * texture.rowpixels + (curu >> 17) * 2; - return (texbase[(curu >> 16) & 1] >> 8) | ((texbase[0] & 0xff) << 8) | ((texbase[1] & 0xff) << 16); + s32 u = std::clamp(curu >> 16, 0, texture.width - 1); + s32 v = std::clamp(curv >> 16, 0, texture.height - 1); + + const u16 *texbase = reinterpret_cast(texture.base) + v * texture.rowpixels + (u >> 1) * 2; + return (texbase[u & 1] >> 8) | ((texbase[0] & 0xff) << 8) | ((texbase[1] & 0xff) << 16); } }