sw_engine image: apply rgba blending.
authorHermet Park <chuneon.park@samsung.com>
Tue, 23 Nov 2021 06:19:50 +0000 (15:19 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Thu, 25 Nov 2021 00:34:37 +0000 (09:34 +0900)
rgba requires the default blending.

src/lib/sw_engine/tvgSwRaster.cpp

index 40879567f1290d787d19fee06eeb5a673d2c070f..5f053d8b1b62c988eb9c61b4e68b6c7e1109a78c 100644 (file)
@@ -662,7 +662,7 @@ static bool _rasterDirectRleRGBAImage(SwSurface* surface, const SwImage* image)
         auto img = image->data + (span->y + image->oy) * image->stride + (span->x + image->ox);
         if (span->coverage == 255) {
             for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) {
-                *dst = *img;
+                *dst = *img + ALPHA_BLEND(*dst, surface->blender.ialpha(*img));
             }
         } else {
             for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) {
@@ -911,7 +911,8 @@ static bool _rasterTransformedRGBAImage(SwSurface* surface, const SwImage* image
             auto rX = static_cast<uint32_t>(roundf(x * itransform->e11 + ey1));
             auto rY = static_cast<uint32_t>(roundf(x * itransform->e21 + ey2));
             if (rX >= w || rY >= h) continue;
-            *dst = img[rX + (rY * image->stride)];
+            auto src = img[rX + (rY * image->stride)];
+            *dst = src + ALPHA_BLEND(*dst, surface->blender.ialpha(src));
         }
     }
     return true;
@@ -935,7 +936,7 @@ static bool _rasterDownScaledRGBAImage(SwSurface* surface, const SwImage* image,
             uint32_t src;
             if (rX < halfScale || rY < halfScale || rX >= w - halfScale || rY >= h - halfScale) src = img[rX + (rY * w)];
             else src = _interpDownScaler(img, w, h, rX, rY, halfScale);
-            *dst = src;
+            *dst = src + ALPHA_BLEND(*dst, surface->blender.ialpha(src));
         }
     }
     return true;
@@ -961,7 +962,7 @@ static bool _rasterUpScaledRGBAImage(SwSurface* surface, const SwImage* image, c
             uint32_t src;
             if (rX == w - 1 || rY == h - 1) src = img[rX + (rY * w)];
             else src = _interpUpScaler(img, w, h, fX, fY);
-            *dst = src;
+            *dst = src + ALPHA_BLEND(*dst, surface->blender.ialpha(src));
         }
     }
     return true;