Chromium Code Reviews| Index: samplecode/SampleFilterFuzz.cpp |
| diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp |
| index e073f80b0c1c16651cd2eb47d2dc0ce6aadc6582..a01c38b05e3f09b6fd91f924da3267f6150d7fd8 100644 |
| --- a/samplecode/SampleFilterFuzz.cpp |
| +++ b/samplecode/SampleFilterFuzz.cpp |
| @@ -9,6 +9,7 @@ |
| #include "SkBitmapSource.h" |
| #include "SkBlurImageFilter.h" |
| #include "SkCanvas.h" |
| +#include "SkColorCubeFilter.h" |
| #include "SkColorFilter.h" |
| #include "SkColorFilterImageFilter.h" |
| #include "SkComposeImageFilter.h" |
| @@ -210,6 +211,48 @@ static const SkBitmap& make_bitmap() { |
| return bitmap[R(2)]; |
| } |
| +static SkData* make_3Dlut(int* cubeDimension, bool invR, bool invG, bool invB) { |
| + int size = 4; |
| + switch (R(5)) { |
|
Stephen White
2014/10/24 22:48:37
Nit: couldn't this also be
int size = 4 << R(5) ?
sugoi1
2014/10/27 14:55:32
Done.
|
| + case 4: |
| + size *= 2; // 64 |
| + case 3: |
| + size *= 2; // 32 |
| + case 2: |
| + size *= 2; // 16 |
| + case 1: |
| + size *= 2; // 8 |
| + default: |
| + break; |
| + } |
| + |
| + SkData* data = SkData::NewUninitialized(sizeof(SkColor) * size * size * size); |
|
Stephen White
2014/10/24 22:48:38
Should we also be trying to give the fuzzer trunca
sugoi1
2014/10/27 14:55:32
Yeah, the fuzzer should take care of that case aut
|
| + SkColor* pixels = (SkColor*)(data->writable_data()); |
| + SkAutoMalloc lutMemory(size); |
| + SkAutoMalloc invLutMemory(size); |
| + uint8_t* lut = (uint8_t*)lutMemory.get(); |
| + uint8_t* invLut = (uint8_t*)invLutMemory.get(); |
| + const int maxIndex = size - 1; |
| + for (int i = 0; i < size; i++) { |
| + lut[i] = (i * 255) / maxIndex; |
| + invLut[i] = ((maxIndex - i) * 255) / maxIndex; |
| + } |
| + for (int r = 0; r < size; ++r) { |
| + for (int g = 0; g < size; ++g) { |
| + for (int b = 0; b < size; ++b) { |
| + pixels[(size * ((size * b) + g)) + r] = SkColorSetARGB(0xFF, |
| + invR ? invLut[r] : lut[r], |
| + invG ? invLut[g] : lut[g], |
| + invB ? invLut[b] : lut[b]); |
| + } |
| + } |
| + } |
| + if (cubeDimension) { |
| + *cubeDimension = size; |
| + } |
| + return data; |
| +} |
| + |
| static void drawSomething(SkCanvas* canvas) { |
| SkPaint paint; |
| @@ -238,7 +281,7 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
| // Add a 1 in 3 chance to get a NULL input |
| if (canBeNull && (R(3) == 1)) { return filter; } |
| - enum { ALPHA_THRESHOLD, MERGE, COLOR, BLUR, MAGNIFIER, |
| + enum { ALPHA_THRESHOLD, MERGE, COLOR, LUT3D, BLUR, MAGNIFIER, |
| DOWN_SAMPLE, XFERMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE, |
| DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW, |
| MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, NUM_FILTERS }; |
| @@ -258,6 +301,14 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
| filter = cf.get() ? SkColorFilterImageFilter::Create(cf, make_image_filter()) : 0; |
| } |
| break; |
| + case LUT3D: |
| + { |
| + int cubeDimension; |
| + SkAutoDataUnref lut3D(make_3Dlut(&cubeDimension, (R(2) == 1), (R(2) == 1), (R(2) == 1))); |
| + SkAutoTUnref<SkColorFilter> cf(SkColorCubeFilter::Create(lut3D, cubeDimension)); |
| + filter = cf.get() ? SkColorFilterImageFilter::Create(cf, make_image_filter()) : 0; |
| + } |
| + break; |
| case BLUR: |
| filter = SkBlurImageFilter::Create(make_scalar(true), make_scalar(true), make_image_filter()); |
| break; |