Index: src/effects/SkMatrixConvolutionImageFilter.cpp |
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp |
index 75e3f7a9030839eba4c8e8859d50f36676d37c71..ae29bcb01b338a0397e183dce4185b113c48f637 100644 |
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp |
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp |
@@ -17,6 +17,10 @@ |
#include "effects/GrMatrixConvolutionEffect.h" |
#endif |
+// We need to be able to read at most SK_MaxS32 bytes, so divide that |
+// by the size of a scalar to know how many scalars we can read. |
+static const int32_t gMaxKernelSize = SK_MaxS32 / sizeof(SkScalar); |
+ |
SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter( |
const SkISize& kernelSize, |
const SkScalar* kernel, |
@@ -35,7 +39,7 @@ SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter( |
fKernelOffset(kernelOffset), |
fTileMode(tileMode), |
fConvolveAlpha(convolveAlpha) { |
- uint32_t size = fKernelSize.fWidth * fKernelSize.fHeight; |
+ size_t size = (size_t) sk_64_mul(fKernelSize.width(), fKernelSize.height()); |
fKernel = SkNEW_ARRAY(SkScalar, size); |
memcpy(fKernel, kernel, size * sizeof(SkScalar)); |
SkASSERT(kernelSize.fWidth >= 1 && kernelSize.fHeight >= 1); |
@@ -43,6 +47,31 @@ SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter( |
SkASSERT(kernelOffset.fY >= 0 && kernelOffset.fY < kernelSize.fHeight); |
} |
+SkMatrixConvolutionImageFilter* SkMatrixConvolutionImageFilter::Create( |
+ const SkISize& kernelSize, |
+ const SkScalar* kernel, |
+ SkScalar gain, |
+ SkScalar bias, |
+ const SkIPoint& kernelOffset, |
+ TileMode tileMode, |
+ bool convolveAlpha, |
+ SkImageFilter* input, |
+ const CropRect* cropRect, |
+ uint32_t uniqueID) { |
+ if (kernelSize.width() < 1 || kernelSize.height() < 1) { |
+ return NULL; |
+ } |
+ if (gMaxKernelSize / kernelSize.fWidth < kernelSize.fHeight) { |
+ return NULL; |
+ } |
+ if (!kernel) { |
+ return NULL; |
+ } |
+ return SkNEW_ARGS(SkMatrixConvolutionImageFilter, (kernelSize, kernel, gain, bias, |
+ kernelOffset, tileMode, convolveAlpha, |
+ input, cropRect, uniqueID)); |
+} |
+ |
#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING |
static bool tile_mode_is_valid(SkMatrixConvolutionImageFilter::TileMode tileMode) { |
switch (tileMode) { |
@@ -58,16 +87,13 @@ static bool tile_mode_is_valid(SkMatrixConvolutionImageFilter::TileMode tileMode |
SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(SkReadBuffer& buffer) |
: INHERITED(1, buffer) { |
- // We need to be able to read at most SK_MaxS32 bytes, so divide that |
- // by the size of a scalar to know how many scalars we can read. |
- static const int32_t kMaxSize = SK_MaxS32 / sizeof(SkScalar); |
fKernelSize.fWidth = buffer.readInt(); |
fKernelSize.fHeight = buffer.readInt(); |
if ((fKernelSize.fWidth >= 1) && (fKernelSize.fHeight >= 1) && |
// Make sure size won't be larger than a signed int, |
// which would still be extremely large for a kernel, |
// but we don't impose a hard limit for kernel size |
- (kMaxSize / fKernelSize.fWidth >= fKernelSize.fHeight)) { |
+ (gMaxKernelSize / fKernelSize.fWidth >= fKernelSize.fHeight)) { |
size_t size = fKernelSize.fWidth * fKernelSize.fHeight; |
fKernel = SkNEW_ARRAY(SkScalar, size); |
SkDEBUGCODE(bool success =) buffer.readScalarArray(fKernel, size); |