Index: fuzz/FuzzGradients.cpp |
diff --git a/fuzz/FuzzGradients.cpp b/fuzz/FuzzGradients.cpp |
index 2478bca283203101e6c5631f05b069f6cf2d68f2..6ed4b7cb7a795c76ea06af73f1ded06c3a5dc47f 100644 |
--- a/fuzz/FuzzGradients.cpp |
+++ b/fuzz/FuzzGradients.cpp |
@@ -32,44 +32,35 @@ bool makeMatrix(Fuzz* fuzz, SkMatrix* m) { |
return true; |
} |
-bool initGradientParams(Fuzz* fuzz, uint32_t* count, SkColor** colors, SkScalar** pos, |
- SkShader::TileMode* mode) { |
+bool initGradientParams(Fuzz* fuzz, std::vector<SkColor>* colors, |
+ std::vector<SkScalar>* pos, SkShader::TileMode* mode) { |
if (fuzz->remaining() < sizeof(uint32_t)) { |
return false; |
} |
- uint32_t t_count; |
- SkColor* t_colors; |
- SkScalar* t_pos; |
+ uint32_t count = fuzz->nextRangeU(0, MAX_COUNT); |
- t_count = fuzz->nextRangeU(0, MAX_COUNT); |
- if (t_count == 1) { |
- t_count = 2; |
- } |
- |
- if (fuzz->remaining() < (1 + t_count * (sizeof(SkColor) + sizeof(SkScalar)))) { |
+ if (fuzz->remaining() < sizeof(uint32_t)) { |
return false; |
} |
- t_colors = new SkColor[t_count]; |
- t_pos = new SkScalar[t_count]; |
- for (uint32_t i = 0; i < t_count; i++) { |
- fuzz->next(&t_colors[i]); |
- fuzz->next(&t_pos[i]); |
- } |
- |
- if (t_count == 0) { |
- *count = 0; |
- *colors = NULL; |
- *pos = NULL; |
- } else { |
- std::sort(t_pos, t_pos + t_count); |
- t_pos[0] = 0; |
- t_pos[t_count - 1] = 1; |
- *count = t_count; |
- *colors = t_colors; |
- *pos = t_pos; |
- } |
- |
*mode = static_cast<SkShader::TileMode>(fuzz->nextRangeU(0, 3)); |
+ |
+ colors->clear(); |
+ pos ->clear(); |
+ for (uint32_t i = 0; i < count; i++) { |
+ SkColor c; |
+ SkScalar s; |
+ if (!fuzz->next(&c) || !fuzz->next(&s)) { |
+ return false; |
+ } |
+ colors->push_back(c); |
+ pos ->push_back(s); |
+ } |
+ if (count) { |
+ std::sort(pos->begin(), pos->end()); |
+ // The order matters. If count == 1, we want pos == 0. |
+ (*pos)[count - 1] = 1; |
+ (*pos)[0] = 0; |
+ } |
return true; |
} |
@@ -86,11 +77,10 @@ void fuzzLinearGradient(Fuzz* fuzz) { |
} |
SkPoint pts[2] = {SkPoint::Make(a,b), SkPoint::Make(c, d)}; |
- uint32_t count; |
- SkColor* colors; |
- SkScalar* pos; |
+ std::vector<SkColor> colors; |
+ std::vector<SkScalar> pos; |
SkShader::TileMode mode; |
- if (!initGradientParams(fuzz, &count, &colors, &pos, &mode)) { |
+ if (!initGradientParams(fuzz, &colors, &pos, &mode)) { |
return; |
} |
@@ -104,8 +94,8 @@ void fuzzLinearGradient(Fuzz* fuzz) { |
if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { |
return; |
} |
- p.setShader(SkGradientShader::MakeLinear(pts, colors, pos, count, mode, |
- flags, localMatrix.getMaybeNull())); |
+ p.setShader(SkGradientShader::MakeLinear(pts, colors.data(), pos.data(), |
+ colors.size(), mode, flags, localMatrix.getMaybeNull())); |
sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(50, 50)); |
if (useGlobalMatrix) { |
@@ -133,11 +123,10 @@ void fuzzRadialGradient(Fuzz* fuzz) { |
} |
SkPoint center = SkPoint::Make(a,b); |
- uint32_t count; |
- SkColor* colors; |
- SkScalar* pos; |
+ std::vector<SkColor> colors; |
+ std::vector<SkScalar> pos; |
SkShader::TileMode mode; |
- if (!initGradientParams(fuzz, &count, &colors, &pos, &mode)) { |
+ if (!initGradientParams(fuzz, &colors, &pos, &mode)) { |
return; |
} |
@@ -151,8 +140,8 @@ void fuzzRadialGradient(Fuzz* fuzz) { |
if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { |
return; |
} |
- p.setShader(SkGradientShader::MakeRadial(center, radius, colors, pos, |
- count, mode, flags, localMatrix.getMaybeNull())); |
+ p.setShader(SkGradientShader::MakeRadial(center, radius, colors.data(), |
+ pos.data(), colors.size(), mode, flags, localMatrix.getMaybeNull())); |
sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(50, 50)); |
@@ -185,11 +174,10 @@ void fuzzTwoPointConicalGradient(Fuzz* fuzz) { |
SkPoint start = SkPoint::Make(a, b); |
SkPoint end = SkPoint::Make(c, d); |
- uint32_t count; |
- SkColor* colors; |
- SkScalar* pos; |
+ std::vector<SkColor> colors; |
+ std::vector<SkScalar> pos; |
SkShader::TileMode mode; |
- if (!initGradientParams(fuzz, &count, &colors, &pos, &mode)) { |
+ if (!initGradientParams(fuzz, &colors, &pos, &mode)) { |
return; |
} |
@@ -203,8 +191,9 @@ void fuzzTwoPointConicalGradient(Fuzz* fuzz) { |
if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { |
return; |
} |
- p.setShader(SkGradientShader::MakeTwoPointConical(start, startRadius, end, |
- endRadius, colors, pos, count, mode, flags, localMatrix.getMaybeNull())); |
+ p.setShader(SkGradientShader::MakeTwoPointConical(start, startRadius, |
+ end, endRadius, colors.data(), pos.data(), colors.size(), mode, |
+ flags, localMatrix.getMaybeNull())); |
sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(50, 50)); |
if (useGlobalMatrix) { |
@@ -230,11 +219,10 @@ void fuzzSweepGradient(Fuzz* fuzz) { |
return; |
} |
- uint32_t count; |
- SkColor* colors; |
- SkScalar* pos; |
+ std::vector<SkColor> colors; |
+ std::vector<SkScalar> pos; |
SkShader::TileMode mode; |
- if (!initGradientParams(fuzz, &count, &colors, &pos, &mode)) { |
+ if (!initGradientParams(fuzz, &colors, &pos, &mode)) { |
return; |
} |
@@ -248,9 +236,11 @@ void fuzzSweepGradient(Fuzz* fuzz) { |
if (!fuzz->next(&flags)) { |
return; |
} |
- p.setShader(SkGradientShader::MakeSweep(cx, cy, colors, pos, count, flags, &m)); |
+ p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), |
+ pos.data(), colors.size(), flags, &m)); |
} else { |
- p.setShader(SkGradientShader::MakeSweep(cx, cy, colors, pos, count)); |
+ p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), |
+ pos.data(), colors.size())); |
} |