Index: src/effects/gradients/SkGradientShader.cpp |
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp |
index d50afb763838e7e1e819884094ef2233dbaa1d36..d2b8bc30f858d3244d7076494ab9a2cbbabbe886 100644 |
--- a/src/effects/gradients/SkGradientShader.cpp |
+++ b/src/effects/gradients/SkGradientShader.cpp |
@@ -735,6 +735,12 @@ void SkGradientShaderBase::toString(SkString* str) const { |
/////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////// |
+// Return true if these parameters are valid/legal/safe to construct a gradient |
+// |
+static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { |
Stephen White
2015/01/06 14:53:30
Nit: pos is unused here (presumably because NULL i
|
+ return NULL != colors && count >= 1 && tileMode < (unsigned)SkShader::kTileModeCount; |
+} |
+ |
// assumes colors is SkColor* and pos is SkScalar* |
#define EXPAND_1_COLOR(count) \ |
SkColor tmp[2]; \ |
@@ -764,7 +770,10 @@ SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], |
SkShader::TileMode mode, |
uint32_t flags, |
const SkMatrix* localMatrix) { |
- if (NULL == pts || NULL == colors || colorCount < 1) { |
+ if (!pts) { |
+ return NULL; |
+ } |
+ if (!valid_grad(colors, pos, colorCount, mode)) { |
return NULL; |
} |
EXPAND_1_COLOR(colorCount); |
@@ -780,7 +789,10 @@ SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
SkShader::TileMode mode, |
uint32_t flags, |
const SkMatrix* localMatrix) { |
- if (radius <= 0 || NULL == colors || colorCount < 1) { |
+ if (radius <= 0) { |
+ return NULL; |
+ } |
+ if (!valid_grad(colors, pos, colorCount, mode)) { |
return NULL; |
} |
EXPAND_1_COLOR(colorCount); |
@@ -800,7 +812,10 @@ SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, |
SkShader::TileMode mode, |
uint32_t flags, |
const SkMatrix* localMatrix) { |
- if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { |
+ if (startRadius < 0 || endRadius < 0) { |
+ return NULL; |
+ } |
+ if (!valid_grad(colors, pos, colorCount, mode)) { |
return NULL; |
} |
EXPAND_1_COLOR(colorCount); |
@@ -821,7 +836,10 @@ SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
SkShader::TileMode mode, |
uint32_t flags, |
const SkMatrix* localMatrix) { |
- if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { |
+ if (startRadius < 0 || endRadius < 0) { |
+ return NULL; |
+ } |
+ if (!valid_grad(colors, pos, colorCount, mode)) { |
return NULL; |
} |
if (start == end && startRadius == endRadius) { |
@@ -865,7 +883,7 @@ SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |
int colorCount, |
uint32_t flags, |
const SkMatrix* localMatrix) { |
- if (NULL == colors || colorCount < 1) { |
+ if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { |
return NULL; |
} |
EXPAND_1_COLOR(colorCount); |