Index: src/effects/SkMatrixConvolutionImageFilter.cpp |
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp |
index f5d9a3f7d220e2fd01b6a964334be0799c4b7720..870ef159581160d5b928d9709935740cfc0a6bdd 100644 |
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp |
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp |
@@ -8,6 +8,7 @@ |
#include "SkMatrixConvolutionImageFilter.h" |
#include "SkBitmap.h" |
#include "SkColorPriv.h" |
+#include "SkNx.h" |
#include "SkReadBuffer.h" |
#include "SkSpecialImage.h" |
#include "SkSpecialSurface.h" |
@@ -174,7 +175,7 @@ void SkMatrixConvolutionImageFilter::filterPixels(const SkBitmap& src, |
for (int y = rect.fTop; y < rect.fBottom; ++y) { |
SkPMColor* dptr = result->getAddr32(rect.fLeft - bounds.fLeft, y - bounds.fTop); |
for (int x = rect.fLeft; x < rect.fRight; ++x) { |
- SkScalar sumA = 0, sumR = 0, sumG = 0, sumB = 0; |
+ Sk4s sum = 0; |
for (int cy = 0; cy < fKernelSize.fHeight; cy++) { |
for (int cx = 0; cx < fKernelSize.fWidth; cx++) { |
SkPMColor s = PixelFetcher::fetch(src, |
@@ -182,26 +183,19 @@ void SkMatrixConvolutionImageFilter::filterPixels(const SkBitmap& src, |
y + cy - fKernelOffset.fY, |
bounds); |
SkScalar k = fKernel[cy * fKernelSize.fWidth + cx]; |
- if (convolveAlpha) { |
- sumA += SkScalarMul(SkIntToScalar(SkGetPackedA32(s)), k); |
- } |
- sumR += SkScalarMul(SkIntToScalar(SkGetPackedR32(s)), k); |
- sumG += SkScalarMul(SkIntToScalar(SkGetPackedG32(s)), k); |
- sumB += SkScalarMul(SkIntToScalar(SkGetPackedB32(s)), k); |
+ |
+ sum += k * SkNx_cast<SkScalar>(Sk4b::Load(&s)); |
} |
} |
- int a = convolveAlpha |
- ? SkClampMax(SkScalarFloorToInt(SkScalarMul(sumA, fGain) + fBias), 255) |
- : 255; |
- int r = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumR, fGain) + fBias), a); |
- int g = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumG, fGain) + fBias), a); |
- int b = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumB, fGain) + fBias), a); |
- if (!convolveAlpha) { |
- a = SkGetPackedA32(PixelFetcher::fetch(src, x, y, bounds)); |
- *dptr++ = SkPreMultiplyARGB(a, r, g, b); |
+ Sk4s d = Sk4s::Max(0, Sk4s::Min(sum * fGain + fBias, 255.0f)); |
+ |
+ if (convolveAlpha) { |
+ d = Sk4s::Min(d, d[3]); |
} else { |
- *dptr++ = SkPackARGB32(a, r, g, b); |
+ SkScalar a01 = (1/255.0f) * SkGetPackedA32(PixelFetcher::fetch(src, x, y, bounds)); |
+ d = Sk4s{d[0],d[1],d[2], 255} * a01; |
} |
+ SkNx_cast<uint8_t>(d).store(dptr++); |
} |
} |
} |