blob: 0cba43c2669b5b0d526d98c21b3ca10395c12b24 [file] [log] [blame]
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#include "SampleCode.h"
commit-bot@chromium.org067fe482014-05-27 13:52:51 +00008#include "SkAlphaThresholdFilter.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +00009#include "SkBicubicImageFilter.h"
commit-bot@chromium.org77e079a2013-10-28 15:52:02 +000010#include "SkBitmapDevice.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000011#include "SkBitmapSource.h"
12#include "SkBlurImageFilter.h"
13#include "SkCanvas.h"
14#include "SkColorFilter.h"
15#include "SkColorFilterImageFilter.h"
16#include "SkComposeImageFilter.h"
commit-bot@chromium.org77e079a2013-10-28 15:52:02 +000017#include "SkData.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000018#include "SkDisplacementMapEffect.h"
19#include "SkDropShadowImageFilter.h"
20#include "SkFlattenableSerialization.h"
21#include "SkLightingImageFilter.h"
22#include "SkMagnifierImageFilter.h"
commit-bot@chromium.org067fe482014-05-27 13:52:51 +000023#include "SkMatrixImageFilter.h"
24#include "SkMatrixConvolutionImageFilter.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000025#include "SkMergeImageFilter.h"
26#include "SkMorphologyImageFilter.h"
27#include "SkOffsetImageFilter.h"
28#include "SkPerlinNoiseShader.h"
commit-bot@chromium.org7b8d72d2014-01-16 22:54:41 +000029#include "SkPictureImageFilter.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000030#include "SkRandom.h"
31#include "SkRectShaderImageFilter.h"
commit-bot@chromium.org067fe482014-05-27 13:52:51 +000032#include "SkTestImageFilters.h"
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +000033#include "SkTileImageFilter.h"
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000034#include "SkView.h"
35#include "SkXfermodeImageFilter.h"
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +000036#include <stdio.h>
37#include <time.h>
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000038
commit-bot@chromium.orgc2e9db32013-12-06 20:14:46 +000039//#define SK_ADD_RANDOM_BIT_FLIPS
40//#define SK_FUZZER_IS_VERBOSE
41
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +000042static const uint32_t kSeed = (uint32_t)(time(NULL));
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000043static SkRandom gRand(kSeed);
44static bool return_large = false;
45static bool return_undef = false;
46
47static const int kBitmapSize = 24;
48
49static int R(float x) {
50 return (int)floor(SkScalarToFloat(gRand.nextUScalar1()) * x);
51}
52
53#if defined _WIN32
54#pragma warning ( push )
55// we are intentionally causing an overflow here
56// (warning C4756: overflow in constant arithmetic)
57#pragma warning ( disable : 4756 )
58#endif
59
60static float huge() {
61 double d = 1e100;
62 float f = (float)d;
63 return f;
64}
65
66#if defined _WIN32
67#pragma warning ( pop )
68#endif
69
70static float make_number(bool positiveOnly) {
71 float f = positiveOnly ? 1.0f : 0.0f;
72 float v = f;
73 int sel;
74
75 if (return_large) sel = R(6); else sel = R(4);
76 if (!return_undef && sel == 0) sel = 1;
77
78 if (R(2) == 1) v = (float)(R(100)+f); else
79
80 switch (sel) {
81 case 0: break;
82 case 1: v = f; break;
83 case 2: v = 0.000001f; break;
84 case 3: v = 10000.0f; break;
85 case 4: v = 2000000000.0f; break;
86 case 5: v = huge(); break;
87 }
88
89 if (!positiveOnly && (R(4) == 1)) v = -v;
90 return v;
91}
92
93static SkScalar make_scalar(bool positiveOnly = false) {
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +000094 return make_number(positiveOnly);
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +000095}
96
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +000097static SkRect make_rect() {
98 return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))),
99 SkIntToScalar(R(static_cast<float>(kBitmapSize))));
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000100}
101
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000102static SkRegion make_region() {
commit-bot@chromium.orgb859fe62014-05-27 17:03:25 +0000103 SkIRect iRegion = SkIRect::MakeXYWH(R(static_cast<float>(kBitmapSize)),
104 R(static_cast<float>(kBitmapSize)),
105 R(static_cast<float>(kBitmapSize)),
106 R(static_cast<float>(kBitmapSize)));
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000107 return SkRegion(iRegion);
108}
109
110static SkMatrix make_matrix() {
111 SkMatrix m;
112 for (int i = 0; i < 9; ++i) {
113 m[i] = make_scalar();
114 }
115 return m;
116}
117
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000118static SkXfermode::Mode make_xfermode() {
119 return static_cast<SkXfermode::Mode>(R(SkXfermode::kLastMode+1));
120}
121
122static SkColor make_color() {
123 return (R(2) == 1) ? 0xFFC0F0A0 : 0xFF000090;
124}
125
126static SkPoint3 make_point() {
127 return SkPoint3(make_scalar(), make_scalar(), make_scalar(true));
128}
129
130static SkDisplacementMapEffect::ChannelSelectorType make_channel_selector_type() {
131 return static_cast<SkDisplacementMapEffect::ChannelSelectorType>(R(4)+1);
132}
133
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +0000134static bool valid_for_raster_canvas(const SkImageInfo& info) {
135 switch (info.colorType()) {
136 case kAlpha_8_SkColorType:
137 case kRGB_565_SkColorType:
138 return true;
commit-bot@chromium.org28fcae22014-04-11 17:15:40 +0000139 case kN32_SkColorType:
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +0000140 return kPremul_SkAlphaType == info.alphaType() ||
141 kOpaque_SkAlphaType == info.alphaType();
142 default:
143 break;
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +0000144 }
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +0000145 return false;
146}
147
148static SkColorType rand_colortype() {
149 return (SkColorType)R(kLastEnum_SkColorType + 1);
150}
151
152static void rand_bitmap_for_canvas(SkBitmap* bitmap) {
153 SkImageInfo info;
154 do {
155 info = SkImageInfo::Make(kBitmapSize, kBitmapSize, rand_colortype(),
156 kPremul_SkAlphaType);
157 } while (!valid_for_raster_canvas(info) || !bitmap->allocPixels(info));
158}
159
160static void make_g_bitmap(SkBitmap& bitmap) {
161 rand_bitmap_for_canvas(&bitmap);
162
163 SkCanvas canvas(bitmap);
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000164 canvas.clear(0x00000000);
165 SkPaint paint;
166 paint.setAntiAlias(true);
167 paint.setColor(0xFF884422);
168 paint.setTextSize(SkIntToScalar(kBitmapSize/2));
169 const char* str = "g";
170 canvas.drawText(str, strlen(str), SkIntToScalar(kBitmapSize/8),
171 SkIntToScalar(kBitmapSize/4), paint);
172}
173
174static void make_checkerboard_bitmap(SkBitmap& bitmap) {
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +0000175 rand_bitmap_for_canvas(&bitmap);
176
177 SkCanvas canvas(bitmap);
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000178 canvas.clear(0x00000000);
179 SkPaint darkPaint;
180 darkPaint.setColor(0xFF804020);
181 SkPaint lightPaint;
182 lightPaint.setColor(0xFF244484);
183 const int i = kBitmapSize / 8;
184 const SkScalar f = SkIntToScalar(i);
185 for (int y = 0; y < kBitmapSize; y += i) {
186 for (int x = 0; x < kBitmapSize; x += i) {
187 canvas.save();
188 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
189 canvas.drawRect(SkRect::MakeXYWH(0, 0, f, f), darkPaint);
190 canvas.drawRect(SkRect::MakeXYWH(f, 0, f, f), lightPaint);
191 canvas.drawRect(SkRect::MakeXYWH(0, f, f, f), lightPaint);
192 canvas.drawRect(SkRect::MakeXYWH(f, f, f, f), darkPaint);
193 canvas.restore();
194 }
195 }
196}
197
198static const SkBitmap& make_bitmap() {
199 static SkBitmap bitmap[2];
200 static bool initialized = false;
201 if (!initialized) {
202 make_g_bitmap(bitmap[0]);
203 make_checkerboard_bitmap(bitmap[1]);
204 initialized = true;
205 }
206 return bitmap[R(2)];
207}
208
commit-bot@chromium.org5e0995e2014-02-07 12:20:04 +0000209#ifdef SK_ALLOW_PICTUREIMAGEFILTER_SERIALIZATION
210static void drawSomething(SkCanvas* canvas) {
211 SkPaint paint;
212
213 canvas->save();
214 canvas->scale(0.5f, 0.5f);
215 canvas->drawBitmap(make_bitmap(), 0, 0, NULL);
216 canvas->restore();
217
218 const char beforeStr[] = "before circle";
219 const char afterStr[] = "after circle";
220
221 paint.setAntiAlias(true);
222
223 paint.setColor(SK_ColorRED);
224 canvas->drawData(beforeStr, sizeof(beforeStr));
225 canvas->drawCircle(SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/3), paint);
226 canvas->drawData(afterStr, sizeof(afterStr));
227 paint.setColor(SK_ColorBLACK);
228 paint.setTextSize(SkIntToScalar(kBitmapSize/3));
229 canvas->drawText("Picture", 7, SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/4), paint);
230}
231#endif
232
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000233static SkImageFilter* make_image_filter(bool canBeNull = true) {
234 SkImageFilter* filter = 0;
235
236 // Add a 1 in 3 chance to get a NULL input
237 if (canBeNull && (R(3) == 1)) { return filter; }
238
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000239 enum { ALPHA_THRESHOLD, BICUBIC, MERGE, COLOR, BLUR, MAGNIFIER,
240 DOWN_SAMPLE, XFERMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE,
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000241 DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW,
commit-bot@chromium.org7b8d72d2014-01-16 22:54:41 +0000242 MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, NUM_FILTERS };
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000243
244 switch (R(NUM_FILTERS)) {
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000245 case ALPHA_THRESHOLD:
246 filter = SkAlphaThresholdFilter::Create(make_region(), make_scalar(), make_scalar());
247 break;
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000248 case BICUBIC:
249 // Scale is set to 1 here so that it can fit in the DAG without resizing the output
250 filter = SkBicubicImageFilter::CreateMitchell(SkSize::Make(1, 1), make_image_filter());
251 break;
252 case MERGE:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000253 filter = SkMergeImageFilter::Create(make_image_filter(), make_image_filter(), make_xfermode());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000254 break;
255 case COLOR:
256 {
257 SkAutoTUnref<SkColorFilter> cf((R(2) == 1) ?
258 SkColorFilter::CreateModeFilter(make_color(), make_xfermode()) :
259 SkColorFilter::CreateLightingFilter(make_color(), make_color()));
260 filter = cf.get() ? SkColorFilterImageFilter::Create(cf, make_image_filter()) : 0;
261 }
262 break;
263 case BLUR:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000264 filter = SkBlurImageFilter::Create(make_scalar(true), make_scalar(true), make_image_filter());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000265 break;
266 case MAGNIFIER:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000267 filter = SkMagnifierImageFilter::Create(make_rect(), make_scalar(true));
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000268 break;
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000269 case DOWN_SAMPLE:
270 filter = SkDownSampleImageFilter::Create(make_scalar());
271 break;
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000272 case XFERMODE:
273 {
274 SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(make_xfermode()));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000275 filter = SkXfermodeImageFilter::Create(mode, make_image_filter(), make_image_filter());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000276 }
277 break;
278 case OFFSET:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000279 filter = SkOffsetImageFilter::Create(make_scalar(), make_scalar(), make_image_filter());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000280 break;
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000281 case MATRIX:
282 filter = SkMatrixImageFilter::Create(make_matrix(),
283 (SkPaint::FilterLevel)R(4),
284 make_image_filter());
285 break;
286 case MATRIX_CONVOLUTION:
287 {
288 SkImageFilter::CropRect cropR(SkRect::MakeWH(SkIntToScalar(kBitmapSize),
289 SkIntToScalar(kBitmapSize)));
290 SkISize size = SkISize::Make(R(10)+1, R(10)+1);
291 int arraySize = size.width() * size.height();
292 SkTArray<SkScalar> kernel(arraySize);
293 for (int i = 0; i < arraySize; ++i) {
294 kernel.push_back() = make_scalar();
295 }
commit-bot@chromium.orgb859fe62014-05-27 17:03:25 +0000296 SkIPoint kernelOffset = SkIPoint::Make(R(SkIntToScalar(size.width())),
297 R(SkIntToScalar(size.height())));
commit-bot@chromium.org067fe482014-05-27 13:52:51 +0000298 filter = SkMatrixConvolutionImageFilter::Create(size,
299 kernel.begin(),
300 make_scalar(),
301 make_scalar(),
302 kernelOffset,
303 (SkMatrixConvolutionImageFilter::TileMode)R(3),
304 R(2) == 1,
305 make_image_filter(),
306 &cropR);
307 }
308 break;
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000309 case COMPOSE:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000310 filter = SkComposeImageFilter::Create(make_image_filter(), make_image_filter());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000311 break;
312 case DISTANT_LIGHT:
313 filter = (R(2) == 1) ?
314 SkLightingImageFilter::CreateDistantLitDiffuse(make_point(),
315 make_color(), make_scalar(), make_scalar(), make_image_filter()) :
316 SkLightingImageFilter::CreateDistantLitSpecular(make_point(),
317 make_color(), make_scalar(), make_scalar(), SkIntToScalar(R(10)),
318 make_image_filter());
319 break;
320 case POINT_LIGHT:
321 filter = (R(2) == 1) ?
322 SkLightingImageFilter::CreatePointLitDiffuse(make_point(),
323 make_color(), make_scalar(), make_scalar(), make_image_filter()) :
324 SkLightingImageFilter::CreatePointLitSpecular(make_point(),
325 make_color(), make_scalar(), make_scalar(), SkIntToScalar(R(10)),
326 make_image_filter());
327 break;
328 case SPOT_LIGHT:
329 filter = (R(2) == 1) ?
330 SkLightingImageFilter::CreateSpotLitDiffuse(SkPoint3(0, 0, 0),
331 make_point(), make_scalar(), make_scalar(), make_color(),
332 make_scalar(), make_scalar(), make_image_filter()) :
333 SkLightingImageFilter::CreateSpotLitSpecular(SkPoint3(0, 0, 0),
334 make_point(), make_scalar(), make_scalar(), make_color(),
335 make_scalar(), make_scalar(), SkIntToScalar(R(10)), make_image_filter());
336 break;
337 case NOISE:
338 {
339 SkAutoTUnref<SkShader> shader((R(2) == 1) ?
340 SkPerlinNoiseShader::CreateFractalNoise(
sugoi@google.combb8148b2013-09-19 19:51:27 +0000341 make_scalar(true), make_scalar(true), R(10.0f), make_scalar()) :
commit-bot@chromium.org9fbbcca2014-04-01 16:09:37 +0000342 SkPerlinNoiseShader::CreateTurbulence(
sugoi@google.combb8148b2013-09-19 19:51:27 +0000343 make_scalar(true), make_scalar(true), R(10.0f), make_scalar()));
reed@google.com44699382013-10-31 17:28:30 +0000344 SkImageFilter::CropRect cropR(SkRect::MakeWH(SkIntToScalar(kBitmapSize),
345 SkIntToScalar(kBitmapSize)));
346 filter = SkRectShaderImageFilter::Create(shader, &cropR);
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000347 }
348 break;
349 case DROP_SHADOW:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000350 filter = SkDropShadowImageFilter::Create(make_scalar(), make_scalar(),
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000351 make_scalar(true), make_color(), make_image_filter());
352 break;
353 case MORPHOLOGY:
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000354 if (R(2) == 1) {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000355 filter = SkDilateImageFilter::Create(R(static_cast<float>(kBitmapSize)),
sugoi@google.combb8148b2013-09-19 19:51:27 +0000356 R(static_cast<float>(kBitmapSize)), make_image_filter());
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000357 } else {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000358 filter = SkErodeImageFilter::Create(R(static_cast<float>(kBitmapSize)),
sugoi@google.combb8148b2013-09-19 19:51:27 +0000359 R(static_cast<float>(kBitmapSize)), make_image_filter());
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000360 }
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000361 break;
362 case BITMAP:
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000363 if (R(2) == 1) {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000364 filter = SkBitmapSource::Create(make_bitmap(), make_rect(), make_rect());
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000365 } else {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000366 filter = SkBitmapSource::Create(make_bitmap());
commit-bot@chromium.org43f4a552014-01-15 20:20:24 +0000367 }
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000368 break;
369 case DISPLACE:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000370 filter = SkDisplacementMapEffect::Create(make_channel_selector_type(),
371 make_channel_selector_type(), make_scalar(),
372 make_image_filter(false), make_image_filter());
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000373 break;
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000374 case TILE:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000375 filter = SkTileImageFilter::Create(make_rect(), make_rect(), make_image_filter(false));
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000376 break;
commit-bot@chromium.org7b8d72d2014-01-16 22:54:41 +0000377 case PICTURE:
commit-bot@chromium.org5e0995e2014-02-07 12:20:04 +0000378 {
379 SkPicture* pict = NULL;
380#ifdef SK_ALLOW_PICTUREIMAGEFILTER_SERIALIZATION
381 pict = new SkPicture;
382 SkAutoUnref aur(pict);
383 drawSomething(pict->beginRecording(kBitmapSize, kBitmapSize));
384 pict->endRecording();
385#endif
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000386 filter = SkPictureImageFilter::Create(pict, make_rect());
commit-bot@chromium.org5e0995e2014-02-07 12:20:04 +0000387 }
commit-bot@chromium.org7b8d72d2014-01-16 22:54:41 +0000388 break;
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000389 default:
390 break;
391 }
392 return (filter || canBeNull) ? filter : make_image_filter(canBeNull);
393}
394
commit-bot@chromium.org77e079a2013-10-28 15:52:02 +0000395static SkImageFilter* make_serialized_image_filter() {
396 SkAutoTUnref<SkImageFilter> filter(make_image_filter(false));
397 SkAutoTUnref<SkData> data(SkValidatingSerializeFlattenable(filter));
398 const unsigned char* ptr = static_cast<const unsigned char*>(data->data());
399 size_t len = data->size();
400#ifdef SK_ADD_RANDOM_BIT_FLIPS
401 unsigned char* p = const_cast<unsigned char*>(ptr);
402 for (size_t i = 0; i < len; ++i, ++p) {
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000403 if (R(250) == 1) { // 0.4% of the time, flip a bit or byte
404 if (R(10) == 1) { // Then 10% of the time, change a whole byte
405 switch(R(3)) {
406 case 0:
407 *p ^= 0xFF; // Flip entire byte
408 break;
409 case 1:
410 *p = 0xFF; // Set all bits to 1
411 break;
412 case 2:
413 *p = 0x00; // Set all bits to 0
414 break;
415 }
416 } else {
417 *p ^= (1 << R(8));
418 }
commit-bot@chromium.org77e079a2013-10-28 15:52:02 +0000419 }
420 }
421#endif // SK_ADD_RANDOM_BIT_FLIPS
422 SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(ptr, len,
423 SkImageFilter::GetFlattenableType());
commit-bot@chromium.org77e079a2013-10-28 15:52:02 +0000424 return static_cast<SkImageFilter*>(flattenable);
425}
426
sugoi@google.combb8148b2013-09-19 19:51:27 +0000427static void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000428 canvas->save();
429 canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
430 SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)));
431 canvas->drawBitmap(make_bitmap(), SkIntToScalar(x), SkIntToScalar(y), &paint);
432 canvas->restore();
433}
434
435static void do_fuzz(SkCanvas* canvas) {
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +0000436 SkImageFilter* filter = make_serialized_image_filter();
437
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000438#ifdef SK_FUZZER_IS_VERBOSE
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +0000439 static uint32_t numFilters = 0;
440 static uint32_t numValidFilters = 0;
441 if (0 == numFilters) {
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000442 printf("Fuzzing with %u\n", kSeed);
443 }
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +0000444 numFilters++;
445 if (NULL != filter) {
446 numValidFilters++;
447 }
448 printf("Filter no : %u. Valid filters so far : %u\r", numFilters, numValidFilters);
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000449 fflush(stdout);
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +0000450#endif
451
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000452 SkPaint paint;
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +0000453 SkSafeUnref(paint.setImageFilter(filter));
commit-bot@chromium.org22d69f92013-09-19 18:40:49 +0000454 drawClippedBitmap(canvas, 0, 0, paint);
455}
456
457//////////////////////////////////////////////////////////////////////////////
458
459class ImageFilterFuzzView : public SampleView {
460public:
461 ImageFilterFuzzView() {
462 this->setBGColor(0xFFDDDDDD);
463 }
464
465protected:
466 // overrides from SkEventSink
467 virtual bool onQuery(SkEvent* evt) {
468 if (SampleCode::TitleQ(*evt)) {
469 SampleCode::TitleR(evt, "ImageFilterFuzzer");
470 return true;
471 }
472 return this->INHERITED::onQuery(evt);
473 }
474
475 void drawBG(SkCanvas* canvas) {
476 canvas->drawColor(0xFFDDDDDD);
477 }
478
479 virtual void onDrawContent(SkCanvas* canvas) {
480 do_fuzz(canvas);
481 this->inval(0);
482 }
483
484private:
485 typedef SkView INHERITED;
486};
487
488//////////////////////////////////////////////////////////////////////////////
489
490static SkView* MyFactory() { return new ImageFilterFuzzView; }
491static SkViewRegister reg(MyFactory);