From 2f535cecd0e5a19a3dfb76649b1d90c7e158e24c Mon Sep 17 00:00:00 2001 From: Kevin Lubick Date: Tue, 1 Nov 2016 15:01:12 -0400 Subject: Make fuzzers use cleaner interface signalBoring() no longer exists. When the fuzzer runs out of randomness, it just returns 0. Fuzzers should not go into infinite loops if this happens. do while loops are particularly error-prone. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3963 Change-Id: Iebcfc14cc6b0a19c5dd015cd39875c81fa44003e Reviewed-on: https://skia-review.googlesource.com/3963 Commit-Queue: Kevin Lubick Reviewed-by: Mike Klein --- fuzz/FuzzGradients.cpp | 351 +++++++++++++++++++------------------------------ 1 file changed, 136 insertions(+), 215 deletions(-) (limited to 'fuzz/FuzzGradients.cpp') diff --git a/fuzz/FuzzGradients.cpp b/fuzz/FuzzGradients.cpp index 6ed4b7cb7a..df36c7ce8f 100644 --- a/fuzz/FuzzGradients.cpp +++ b/fuzz/FuzzGradients.cpp @@ -12,48 +12,27 @@ #include "SkTLazy.h" #include +#include const int MAX_COUNT = 400; -bool makeMatrix(Fuzz* fuzz, SkMatrix* m) { - SkScalar scaleX, skewX, transX, skewY, scaleY, transY, persp0, persp1, persp2; - if (!fuzz->next(&scaleX) || - !fuzz->next(&skewX) || - !fuzz->next(&transX) || - !fuzz->next(&skewY) || - !fuzz->next(&scaleY) || - !fuzz->next(&transY) || - !fuzz->next(&persp0) || - !fuzz->next(&persp1) || - !fuzz->next(&persp2)) { - return false; - } - m->setAll(scaleX, skewX, transX, skewY, scaleY, transY, persp0, persp1, persp2); - return true; +void makeMatrix(Fuzz* fuzz, SkMatrix* m) { + m->setAll(fuzz->next(), fuzz->next(), fuzz->next(), + fuzz->next(), fuzz->next(), fuzz->next(), + fuzz->next(), fuzz->next(), fuzz->next()); } -bool initGradientParams(Fuzz* fuzz, std::vector* colors, - std::vector* pos, SkShader::TileMode* mode) { - if (fuzz->remaining() < sizeof(uint32_t)) { - return false; - } - uint32_t count = fuzz->nextRangeU(0, MAX_COUNT); +void initGradientParams(Fuzz* fuzz, std::vector* colors, + std::vector* pos, SkShader::TileMode* mode) { + int count = fuzz->nextRange(0, MAX_COUNT); - if (fuzz->remaining() < sizeof(uint32_t)) { - return false; - } - *mode = static_cast(fuzz->nextRangeU(0, 3)); + *mode = static_cast(fuzz->nextRange(0, 2)); 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); + for (int i = 0; i < count; i++) { + colors->push_back(fuzz->next()); + pos ->push_back(fuzz->next()); } if (count) { std::sort(pos->begin(), pos->end()); @@ -61,208 +40,150 @@ bool initGradientParams(Fuzz* fuzz, std::vector* colors, (*pos)[count - 1] = 1; (*pos)[0] = 0; } - return true; } void fuzzLinearGradient(Fuzz* fuzz) { - SkScalar a, b, c, d; - bool useLocalMatrix, useGlobalMatrix; - if (!fuzz->next(&a) || - !fuzz->next(&b) || - !fuzz->next(&c) || - !fuzz->next(&d) || - !fuzz->next(&useLocalMatrix) || - !fuzz->next(&useGlobalMatrix)) { - return; - } - SkPoint pts[2] = {SkPoint::Make(a,b), SkPoint::Make(c, d)}; - - std::vector colors; - std::vector pos; - SkShader::TileMode mode; - if (!initGradientParams(fuzz, &colors, &pos, &mode)) { - return; - } - - SkPaint p; - uint32_t flags; - if (!fuzz->next(&flags)) { - return; - } - - SkTLazy localMatrix; - if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { - return; - } - p.setShader(SkGradientShader::MakeLinear(pts, colors.data(), pos.data(), - colors.size(), mode, flags, localMatrix.getMaybeNull())); - - sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); - if (useGlobalMatrix) { - SkMatrix gm; - if (!makeMatrix(fuzz, &gm)) { - return; - } - SkCanvas* c = surface->getCanvas(); - c->setMatrix(gm); - c->drawPaint(p); - } else { - surface->getCanvas()->drawPaint(p); - } + SkPoint pts[2] = {SkPoint::Make(fuzz->next(), fuzz->next()), + SkPoint::Make(fuzz->next(), fuzz->next())}; + bool useLocalMatrix = fuzz->next(); + bool useGlobalMatrix = fuzz->next(); + + std::vector colors; + std::vector pos; + SkShader::TileMode mode; + initGradientParams(fuzz, &colors, &pos, &mode); + + SkPaint p; + uint32_t flags = fuzz->next(); + + SkTLazy localMatrix; + if (useLocalMatrix) { + makeMatrix(fuzz, localMatrix.init()); + } + p.setShader(SkGradientShader::MakeLinear(pts, colors.data(), pos.data(), + colors.size(), mode, flags, localMatrix.getMaybeNull())); + + sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); + if (useGlobalMatrix) { + SkMatrix gm; + makeMatrix(fuzz, &gm); + SkCanvas* c = surface->getCanvas(); + c->setMatrix(gm); + c->drawPaint(p); + } else { + surface->getCanvas()->drawPaint(p); + } } void fuzzRadialGradient(Fuzz* fuzz) { - SkScalar a, b, radius; - bool useLocalMatrix, useGlobalMatrix; - if (!fuzz->next(&a) || - !fuzz->next(&b) || - !fuzz->next(&radius) || - !fuzz->next(&useLocalMatrix) || - !fuzz->next(&useGlobalMatrix)) { - return; - } - SkPoint center = SkPoint::Make(a,b); + SkPoint center = SkPoint::Make(fuzz->next(), fuzz->next()); + SkScalar radius = fuzz->next(); + bool useLocalMatrix = fuzz->next(); + bool useGlobalMatrix = fuzz->next(); - std::vector colors; - std::vector pos; - SkShader::TileMode mode; - if (!initGradientParams(fuzz, &colors, &pos, &mode)) { - return; - } - SkPaint p; - uint32_t flags; - if (!fuzz->next(&flags)) { - return; - } - - SkTLazy localMatrix; - if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { - return; - } - p.setShader(SkGradientShader::MakeRadial(center, radius, colors.data(), - pos.data(), colors.size(), mode, flags, localMatrix.getMaybeNull())); + std::vector colors; + std::vector pos; + SkShader::TileMode mode; + initGradientParams(fuzz, &colors, &pos, &mode); + SkPaint p; + uint32_t flags = fuzz->next(); - sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); - if (useGlobalMatrix) { - SkMatrix gm; - if (!makeMatrix(fuzz, &gm)) { - return; - } - SkCanvas* c = surface->getCanvas(); - c->setMatrix(gm); - c->drawPaint(p); - } else { - surface->getCanvas()->drawPaint(p); - } + SkTLazy localMatrix; + if (useLocalMatrix) { + makeMatrix(fuzz, localMatrix.init()); + } + p.setShader(SkGradientShader::MakeRadial(center, radius, colors.data(), + pos.data(), colors.size(), mode, flags, localMatrix.getMaybeNull())); + + + sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); + if (useGlobalMatrix) { + SkMatrix gm; + makeMatrix(fuzz, &gm); + SkCanvas* c = surface->getCanvas(); + c->setMatrix(gm); + c->drawPaint(p); + } else { + surface->getCanvas()->drawPaint(p); + } } void fuzzTwoPointConicalGradient(Fuzz* fuzz) { - SkScalar a, b, startRadius, c, d, endRadius; - bool useLocalMatrix, useGlobalMatrix; - if (!fuzz->next(&a) || - !fuzz->next(&b) || - !fuzz->next(&startRadius) || - !fuzz->next(&c) || - !fuzz->next(&d) || - !fuzz->next(&endRadius) || - !fuzz->next(&useLocalMatrix) || - !fuzz->next(&useGlobalMatrix)) { - return; - } - SkPoint start = SkPoint::Make(a, b); - SkPoint end = SkPoint::Make(c, d); - - std::vector colors; - std::vector pos; - SkShader::TileMode mode; - if (!initGradientParams(fuzz, &colors, &pos, &mode)) { - return; - } - - SkPaint p; - uint32_t flags; - if (!fuzz->next(&flags)) { - return; - } - - SkTLazy localMatrix; - if (useLocalMatrix && !makeMatrix(fuzz, localMatrix.init())) { - return; - } - p.setShader(SkGradientShader::MakeTwoPointConical(start, startRadius, - end, endRadius, colors.data(), pos.data(), colors.size(), mode, - flags, localMatrix.getMaybeNull())); - - sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); - if (useGlobalMatrix) { - SkMatrix gm; - if (!makeMatrix(fuzz, &gm)) { - return; - } - SkCanvas* c = surface->getCanvas(); - c->setMatrix(gm); - c->drawPaint(p); - } else { - surface->getCanvas()->drawPaint(p); - } + SkPoint start = SkPoint::Make(fuzz->next(), fuzz->next()); + SkPoint end = SkPoint::Make(fuzz->next(), fuzz->next()); + SkScalar startRadius = fuzz->next(); + SkScalar endRadius = fuzz->next(); + bool useLocalMatrix = fuzz->next(); + bool useGlobalMatrix = fuzz->next(); + + std::vector colors; + std::vector pos; + SkShader::TileMode mode; + initGradientParams(fuzz, &colors, &pos, &mode); + + SkPaint p; + uint32_t flags = fuzz->next(); + + SkTLazy localMatrix; + if (useLocalMatrix) { + makeMatrix(fuzz, localMatrix.init()); + } + p.setShader(SkGradientShader::MakeTwoPointConical(start, startRadius, + end, endRadius, colors.data(), pos.data(), colors.size(), mode, + flags, localMatrix.getMaybeNull())); + + sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); + if (useGlobalMatrix) { + SkMatrix gm; + makeMatrix(fuzz, &gm); + SkCanvas* c = surface->getCanvas(); + c->setMatrix(gm); + c->drawPaint(p); + } else { + surface->getCanvas()->drawPaint(p); + } } void fuzzSweepGradient(Fuzz* fuzz) { - SkScalar cx, cy; - bool useLocalMatrix, useGlobalMatrix; - if (!fuzz->next(&cx) || - !fuzz->next(&cy) || - !fuzz->next(&useLocalMatrix) || - !fuzz->next(&useGlobalMatrix)) { - return; - } - - std::vector colors; - std::vector pos; - SkShader::TileMode mode; - if (!initGradientParams(fuzz, &colors, &pos, &mode)) { - return; - } - - SkPaint p; - if (useLocalMatrix) { - SkMatrix m; - if (!makeMatrix(fuzz, &m)) { - return; - } - uint32_t flags; - if (!fuzz->next(&flags)) { - return; - } - p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), - pos.data(), colors.size(), flags, &m)); - } else { - p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), - pos.data(), colors.size())); - } - + SkScalar cx = fuzz->next(); + SkScalar cy = fuzz->next(); + bool useLocalMatrix = fuzz->next(); + bool useGlobalMatrix = fuzz->next(); + + std::vector colors; + std::vector pos; + SkShader::TileMode mode; + initGradientParams(fuzz, &colors, &pos, &mode); + + SkPaint p; + if (useLocalMatrix) { + SkMatrix m; + makeMatrix(fuzz, &m); + uint32_t flags = fuzz->next(); + + p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), + pos.data(), colors.size(), flags, &m)); + } else { + p.setShader(SkGradientShader::MakeSweep(cx, cy, colors.data(), + pos.data(), colors.size())); + } - sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); - if (useGlobalMatrix) { - SkMatrix gm; - if (!makeMatrix(fuzz, &gm)) { - return; - } - SkCanvas* c = surface->getCanvas(); - c->setMatrix(gm); - c->drawPaint(p); - } else { - surface->getCanvas()->drawPaint(p); - } + sk_sp surface(SkSurface::MakeRasterN32Premul(50, 50)); + if (useGlobalMatrix) { + SkMatrix gm; + makeMatrix(fuzz, &gm); + SkCanvas* c = surface->getCanvas(); + c->setMatrix(gm); + c->drawPaint(p); + } else { + surface->getCanvas()->drawPaint(p); + } } DEF_FUZZ(Gradients, fuzz) { - uint8_t i; - if (!fuzz->next(&i)) { - return; - } + uint8_t i = fuzz->next(); switch(i) { case 0: -- cgit v1.2.3