| Index: samplecode/SampleFilterFuzz.cpp | 
| diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp | 
| index 3e3436f44893d75bff01b41cb83d88c0201ab71a..85c1066e452052a99400d62c585c96ca2b5d6ac7 100644 | 
| --- a/samplecode/SampleFilterFuzz.cpp | 
| +++ b/samplecode/SampleFilterFuzz.cpp | 
| @@ -25,10 +25,12 @@ | 
| #include "SkPerlinNoiseShader.h" | 
| #include "SkRandom.h" | 
| #include "SkRectShaderImageFilter.h" | 
| +#include "SkTileImageFilter.h" | 
| #include "SkView.h" | 
| #include "SkXfermodeImageFilter.h" | 
| +#include <stdio.h> | 
|  | 
| -static const uint32_t kSeed = 1; | 
| +static const uint32_t kSeed = (uint32_t)(time(NULL)); | 
| static SkRandom gRand(kSeed); | 
| static bool return_large = false; | 
| static bool return_undef = false; | 
| @@ -83,9 +85,9 @@ static SkScalar make_scalar(bool positiveOnly = false) { | 
| return make_number(positiveOnly); | 
| } | 
|  | 
| -static SkRect make_rect(int offset = 1) { | 
| -    return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))+offset), | 
| -                          SkIntToScalar(R(static_cast<float>(kBitmapSize))+offset)); | 
| +static SkRect make_rect() { | 
| +    return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))), | 
| +                          SkIntToScalar(R(static_cast<float>(kBitmapSize)))); | 
| } | 
|  | 
| static SkXfermode::Mode make_xfermode() { | 
| @@ -163,7 +165,7 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { | 
|  | 
| enum { BICUBIC, MERGE, COLOR, BLUR, MAGNIFIER, XFERMODE, OFFSET, COMPOSE, | 
| DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW, | 
| -           MORPHOLOGY, BITMAP, DISPLACE, NUM_FILTERS }; | 
| +           MORPHOLOGY, BITMAP, DISPLACE, TILE, NUM_FILTERS }; | 
|  | 
| switch (R(NUM_FILTERS)) { | 
| case BICUBIC: | 
| @@ -185,7 +187,7 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { | 
| filter = new SkBlurImageFilter(make_scalar(true), make_scalar(true), make_image_filter()); | 
| break; | 
| case MAGNIFIER: | 
| -        filter = new SkMagnifierImageFilter(make_rect(0), make_scalar(true)); | 
| +        filter = new SkMagnifierImageFilter(make_rect(), make_scalar(true)); | 
| break; | 
| case XFERMODE: | 
| { | 
| @@ -256,6 +258,9 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { | 
| make_channel_selector_type(), make_scalar(), | 
| make_image_filter(false), make_image_filter()); | 
| break; | 
| +    case TILE: | 
| +        filter = new SkTileImageFilter(make_rect(), make_rect(), make_image_filter(false)); | 
| +        break; | 
| default: | 
| break; | 
| } | 
| @@ -270,14 +275,27 @@ static SkImageFilter* make_serialized_image_filter() { | 
| #ifdef SK_ADD_RANDOM_BIT_FLIPS | 
| unsigned char* p = const_cast<unsigned char*>(ptr); | 
| for (size_t i = 0; i < len; ++i, ++p) { | 
| -        if ((R(1000) == 1)) { // 0.1% of the time, flip a bit | 
| -            *p ^= (1 << R(8)); | 
| +        if (R(250) == 1) { // 0.4% of the time, flip a bit or byte | 
| +            if (R(10) == 1) { // Then 10% of the time, change a whole byte | 
| +                switch(R(3)) { | 
| +                case 0: | 
| +                    *p ^= 0xFF; // Flip entire byte | 
| +                    break; | 
| +                case 1: | 
| +                    *p = 0xFF; // Set all bits to 1 | 
| +                    break; | 
| +                case 2: | 
| +                    *p = 0x00; // Set all bits to 0 | 
| +                    break; | 
| +                } | 
| +            } else { | 
| +                *p ^= (1 << R(8)); | 
| +            } | 
| } | 
| } | 
| #endif // SK_ADD_RANDOM_BIT_FLIPS | 
| SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(ptr, len, | 
| SkImageFilter::GetFlattenableType()); | 
| -    SkASSERT(NULL != flattenable); | 
| return static_cast<SkImageFilter*>(flattenable); | 
| } | 
|  | 
| @@ -290,8 +308,18 @@ static void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& pai | 
| } | 
|  | 
| static void do_fuzz(SkCanvas* canvas) { | 
| +#ifdef SK_FUZZER_IS_VERBOSE | 
| +    static uint32_t filterId = 0; | 
| +    if (0 == filterId) { | 
| +        printf("Fuzzing with %u\n", kSeed); | 
| +    } | 
| +    printf("Filter no %u\r", filterId); | 
| +    fflush(stdout); | 
| +    filterId++; | 
| +#endif | 
| + | 
| SkPaint paint; | 
| -    paint.setImageFilter(make_serialized_image_filter())->unref(); | 
| +    SkSafeUnref(paint.setImageFilter(make_serialized_image_filter())); | 
| drawClippedBitmap(canvas, 0, 0, paint); | 
| } | 
|  | 
|  |