aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkMaskBlurFilter.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/core/SkMaskBlurFilter.cpp b/src/core/SkMaskBlurFilter.cpp
index 43616c329f..14147f04ce 100644
--- a/src/core/SkMaskBlurFilter.cpp
+++ b/src/core/SkMaskBlurFilter.cpp
@@ -10,6 +10,7 @@
#include <cmath>
#include "SkMakeUnique.h"
+#include "SkSafeMath.h"
static const double kPi = 3.14159265358979323846264338327950288;
@@ -109,8 +110,12 @@ SkIPoint SkMaskBlurFilter::blur(const SkMask& src, SkMask* dst) const {
size_t srcW = src.fBounds.width();
size_t srcH = src.fBounds.height();
- size_t dstW = srcW + 2 * borderW;
- size_t dstH = srcH + 2 * borderH;
+ SkSafeMath safe;
+
+ // size_t dstW = srcW + 2 * borderW;
+ size_t dstW = safe.add(srcW, safe.add(borderW, borderW));
+ //size_t dstH = srcH + 2 * borderH;
+ size_t dstH = safe.add(srcH, safe.add(borderH, borderH));
dst->fBounds.set(0, 0, dstW, dstH);
dst->fBounds.offset(src.fBounds.x(), src.fBounds.y());
@@ -124,7 +129,13 @@ SkIPoint SkMaskBlurFilter::blur(const SkMask& src, SkMask* dst) const {
return {SkTo<int32_t>(borderW), SkTo<int32_t>(borderH)};
}
- dst->fImage = SkMask::AllocImage(dstW * dstH);
+ size_t toAlloc = safe.mul(dstW, dstH);
+ if (!safe) {
+ // There is no border offset because we are not drawing.
+ return {0, 0};
+ }
+ dst->fImage = SkMask::AllocImage(toAlloc);
+
if (weightW > 1 && weightH > 1) {
// Blur both directions.