From e9490e375c639f484c82d7d05a2df29a26e00844 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 13 Sep 2023 14:36:09 +0900 Subject: [PATCH] sw_engine: corrected a wrong blending equation at 8 bits grayscale rle. --- src/renderer/sw_engine/tvgSwRaster.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/renderer/sw_engine/tvgSwRaster.cpp b/src/renderer/sw_engine/tvgSwRaster.cpp index 60054d42..f848faf5 100644 --- a/src/renderer/sw_engine/tvgSwRaster.cpp +++ b/src/renderer/sw_engine/tvgSwRaster.cpp @@ -620,7 +620,15 @@ static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint8_t r, //8bit grayscale } else if (surface->channelSize == sizeof(uint8_t)) { for (uint32_t i = 0; i < rle->size; ++i, ++span) { - rasterGrayscale8(surface->buf8, span->coverage, span->y * surface->stride + span->x, span->len); + if (span->coverage == 255) { + rasterGrayscale8(surface->buf8, span->coverage, span->y * surface->stride + span->x, span->len); + } else { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto ialpha = 255 - span->coverage; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = span->coverage + MULTIPLY(*dst, ialpha); + } + } } } return true;