Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: samplecode/SampleFilterFuzz.cpp

Issue 1556553002: Implement an SkPaint-based image filter (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Add more randomness Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/effects/SkPaintImageFilter.h ('k') | src/effects/SkPaintImageFilter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 #include "SampleCode.h" 7 #include "SampleCode.h"
8 #include "SkAlphaThresholdFilter.h" 8 #include "SkAlphaThresholdFilter.h"
9 #include "SkAnnotation.h"
9 #include "SkBlurImageFilter.h" 10 #include "SkBlurImageFilter.h"
11 #include "SkBlurMaskFilter.h"
10 #include "SkCanvas.h" 12 #include "SkCanvas.h"
11 #include "SkColorCubeFilter.h" 13 #include "SkColorCubeFilter.h"
12 #include "SkColorFilter.h" 14 #include "SkColorFilter.h"
13 #include "SkColorFilterImageFilter.h" 15 #include "SkColorFilterImageFilter.h"
14 #include "SkComposeImageFilter.h" 16 #include "SkComposeImageFilter.h"
17 #include "SkCornerPathEffect.h"
15 #include "SkData.h" 18 #include "SkData.h"
16 #include "SkDisplacementMapEffect.h" 19 #include "SkDisplacementMapEffect.h"
17 #include "SkDropShadowImageFilter.h" 20 #include "SkDropShadowImageFilter.h"
18 #include "SkFlattenableSerialization.h" 21 #include "SkFlattenableSerialization.h"
19 #include "SkImageSource.h" 22 #include "SkImageSource.h"
23 #include "SkLayerRasterizer.h"
20 #include "SkLightingImageFilter.h" 24 #include "SkLightingImageFilter.h"
21 #include "SkMagnifierImageFilter.h" 25 #include "SkMagnifierImageFilter.h"
22 #include "SkMatrixConvolutionImageFilter.h" 26 #include "SkMatrixConvolutionImageFilter.h"
23 #include "SkMergeImageFilter.h" 27 #include "SkMergeImageFilter.h"
24 #include "SkMorphologyImageFilter.h" 28 #include "SkMorphologyImageFilter.h"
25 #include "SkOffsetImageFilter.h" 29 #include "SkOffsetImageFilter.h"
30 #include "SkPaintImageFilter.h"
26 #include "SkPerlinNoiseShader.h" 31 #include "SkPerlinNoiseShader.h"
27 #include "SkPictureImageFilter.h" 32 #include "SkPictureImageFilter.h"
28 #include "SkPictureRecorder.h" 33 #include "SkPictureRecorder.h"
29 #include "SkPoint3.h" 34 #include "SkPoint3.h"
30 #include "SkRandom.h" 35 #include "SkRandom.h"
31 #include "SkRectShaderImageFilter.h"
32 #include "SkTestImageFilters.h" 36 #include "SkTestImageFilters.h"
33 #include "SkTileImageFilter.h" 37 #include "SkTileImageFilter.h"
38 #include "SkTypeface.h"
34 #include "SkView.h" 39 #include "SkView.h"
35 #include "SkXfermodeImageFilter.h" 40 #include "SkXfermodeImageFilter.h"
36 #include <stdio.h> 41 #include <stdio.h>
37 #include <time.h> 42 #include <time.h>
38 43
39 //#define SK_ADD_RANDOM_BIT_FLIPS 44 //#define SK_ADD_RANDOM_BIT_FLIPS
40 //#define SK_FUZZER_IS_VERBOSE 45 //#define SK_FUZZER_IS_VERBOSE
41 46
42 static const uint32_t kSeed = (uint32_t)(time(nullptr)); 47 static const uint32_t kSeed = (uint32_t)(time(nullptr));
43 static SkRandom gRand(kSeed); 48 static SkRandom gRand(kSeed);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 92 }
88 93
89 if (!positiveOnly && (R(4) == 1)) v = -v; 94 if (!positiveOnly && (R(4) == 1)) v = -v;
90 return v; 95 return v;
91 } 96 }
92 97
93 static SkScalar make_scalar(bool positiveOnly = false) { 98 static SkScalar make_scalar(bool positiveOnly = false) {
94 return make_number(positiveOnly); 99 return make_number(positiveOnly);
95 } 100 }
96 101
102 static SkString make_string() {
103 int length = R(1000);
104 SkString str(length);
105 for (int i = 0; i < length; ++i) {
106 str[i] = static_cast<char>(R(256));
107 }
108 return str;
109 }
110
111 static const char* make_font_name() {
112 int sel = R(8);
113
114 switch(sel) {
115 case 0: return "Courier New";
116 case 1: return "Helvetica";
117 case 3: return "monospace";
118 case 4: return "sans-serif";
119 case 5: return "serif";
120 case 6: return "Times";
121 case 7:
122 default:
123 return "Times New Roman";
sugoi1 2016/01/07 16:06:20 Nit: Maybe add an option to get a garbage string.
ajuma 2016/01/08 17:44:28 Done.
124 }
125 }
126
127 static bool make_bool() {
128 return R(2) == 1;
129 }
130
97 static SkRect make_rect() { 131 static SkRect make_rect() {
98 return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))), 132 return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))),
99 SkIntToScalar(R(static_cast<float>(kBitmapSize)))); 133 SkIntToScalar(R(static_cast<float>(kBitmapSize))));
100 } 134 }
101 135
102 static SkRegion make_region() { 136 static SkRegion make_region() {
103 SkIRect iRegion = SkIRect::MakeXYWH(R(static_cast<float>(kBitmapSize)), 137 SkIRect iRegion = SkIRect::MakeXYWH(R(static_cast<float>(kBitmapSize)),
104 R(static_cast<float>(kBitmapSize)), 138 R(static_cast<float>(kBitmapSize)),
105 R(static_cast<float>(kBitmapSize)), 139 R(static_cast<float>(kBitmapSize)),
106 R(static_cast<float>(kBitmapSize))); 140 R(static_cast<float>(kBitmapSize)));
107 return SkRegion(iRegion); 141 return SkRegion(iRegion);
108 } 142 }
109 143
110 static SkMatrix make_matrix() { 144 static SkMatrix make_matrix() {
111 SkMatrix m; 145 SkMatrix m;
112 for (int i = 0; i < 9; ++i) { 146 for (int i = 0; i < 9; ++i) {
113 m[i] = make_scalar(); 147 m[i] = make_scalar();
114 } 148 }
115 return m; 149 return m;
116 } 150 }
117 151
118 static SkXfermode::Mode make_xfermode() { 152 static SkXfermode::Mode make_xfermode() {
119 return static_cast<SkXfermode::Mode>(R(SkXfermode::kLastMode+1)); 153 return static_cast<SkXfermode::Mode>(R(SkXfermode::kLastMode+1));
120 } 154 }
121 155
156 static SkPaint::Align make_paint_align() {
157 return static_cast<SkPaint::Align>(R(SkPaint::kRight_Align+1));
158 }
159
160 static SkPaint::Hinting make_paint_hinting() {
161 return static_cast<SkPaint::Hinting>(R(SkPaint::kFull_Hinting+1));
162 }
163
164 static SkPaint::Style make_paint_style() {
165 return static_cast<SkPaint::Style>(R(SkPaint::kStrokeAndFill_Style+1));
166 }
167
168 static SkPaint::Cap make_paint_cap() {
169 return static_cast<SkPaint::Cap>(R(SkPaint::kDefault_Cap+1));
170 }
171
172 static SkPaint::Join make_paint_join() {
173 return static_cast<SkPaint::Join>(R(SkPaint::kDefault_Join+1));
174 }
175
176 static SkPaint::TextEncoding make_paint_text_encoding() {
177 return static_cast<SkPaint::TextEncoding>(R(SkPaint::kGlyphID_TextEncoding+1 ));
178 }
179
180 static SkBlurStyle make_blur_style() {
181 return static_cast<SkBlurStyle>(R(kLastEnum_SkBlurStyle+1));
182 }
183
184 static SkBlurMaskFilter::BlurFlags make_blur_mask_filter_flag() {
185 return static_cast<SkBlurMaskFilter::BlurFlags>(R(SkBlurMaskFilter::kAll_Blu rFlag+1));
186 }
187
188 static SkFilterQuality make_filter_quality() {
189 return static_cast<SkFilterQuality>(R(kHigh_SkFilterQuality+1));
190 }
191
192 static SkTypeface::Style make_typeface_style() {
193 return static_cast<SkTypeface::Style>(R(SkTypeface::kBoldItalic+1));
194 }
195
122 static SkColor make_color() { 196 static SkColor make_color() {
123 return (R(2) == 1) ? 0xFFC0F0A0 : 0xFF000090; 197 return (R(2) == 1) ? 0xFFC0F0A0 : 0xFF000090;
124 } 198 }
125 199
126 static SkDropShadowImageFilter::ShadowMode make_shadow_mode() { 200 static SkDropShadowImageFilter::ShadowMode make_shadow_mode() {
127 return (R(2) == 1) ? SkDropShadowImageFilter::kDrawShadowAndForeground_Shado wMode : 201 return (R(2) == 1) ? SkDropShadowImageFilter::kDrawShadowAndForeground_Shado wMode :
128 SkDropShadowImageFilter::kDrawShadowOnly_ShadowMode; 202 SkDropShadowImageFilter::kDrawShadowOnly_ShadowMode;
129 } 203 }
130 204
131 static SkPoint3 make_point() { 205 static SkPoint3 make_point() {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 333
260 static SkImageFilter* make_image_filter(bool canBeNull = true) { 334 static SkImageFilter* make_image_filter(bool canBeNull = true) {
261 SkImageFilter* filter = 0; 335 SkImageFilter* filter = 0;
262 336
263 // Add a 1 in 3 chance to get a nullptr input 337 // Add a 1 in 3 chance to get a nullptr input
264 if (canBeNull && (R(3) == 1)) { return filter; } 338 if (canBeNull && (R(3) == 1)) { return filter; }
265 339
266 enum { ALPHA_THRESHOLD, MERGE, COLOR, LUT3D, BLUR, MAGNIFIER, 340 enum { ALPHA_THRESHOLD, MERGE, COLOR, LUT3D, BLUR, MAGNIFIER,
267 DOWN_SAMPLE, XFERMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE, 341 DOWN_SAMPLE, XFERMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE,
268 DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW, 342 DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW,
269 MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, NUM_FILTERS }; 343 MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, PAINT, NUM_FILTERS };
270 344
271 switch (R(NUM_FILTERS)) { 345 switch (R(NUM_FILTERS)) {
272 case ALPHA_THRESHOLD: 346 case ALPHA_THRESHOLD:
273 filter = SkAlphaThresholdFilter::Create(make_region(), make_scalar(), ma ke_scalar()); 347 filter = SkAlphaThresholdFilter::Create(make_region(), make_scalar(), ma ke_scalar());
274 break; 348 break;
275 case MERGE: 349 case MERGE:
276 filter = SkMergeImageFilter::Create(make_image_filter(), make_image_filt er(), make_xfermode()); 350 filter = SkMergeImageFilter::Create(make_image_filter(), make_image_filt er(), make_xfermode());
277 break; 351 break;
278 case COLOR: 352 case COLOR:
279 { 353 {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 make_point(), make_scalar(), make_scalar(), make_color(), 439 make_point(), make_scalar(), make_scalar(), make_color(),
366 make_scalar(), make_scalar(), SkIntToScalar(R(10)), make_image_ filter()); 440 make_scalar(), make_scalar(), SkIntToScalar(R(10)), make_image_ filter());
367 break; 441 break;
368 case NOISE: 442 case NOISE:
369 { 443 {
370 SkAutoTUnref<SkShader> shader((R(2) == 1) ? 444 SkAutoTUnref<SkShader> shader((R(2) == 1) ?
371 SkPerlinNoiseShader::CreateFractalNoise( 445 SkPerlinNoiseShader::CreateFractalNoise(
372 make_scalar(true), make_scalar(true), R(10.0f), make_scalar()) : 446 make_scalar(true), make_scalar(true), R(10.0f), make_scalar()) :
373 SkPerlinNoiseShader::CreateTurbulence( 447 SkPerlinNoiseShader::CreateTurbulence(
374 make_scalar(true), make_scalar(true), R(10.0f), make_scalar())); 448 make_scalar(true), make_scalar(true), R(10.0f), make_scalar()));
449 SkPaint paint;
450 paint.setShader(shader);
375 SkImageFilter::CropRect cropR(SkRect::MakeWH(SkIntToScalar(kBitmapSize), 451 SkImageFilter::CropRect cropR(SkRect::MakeWH(SkIntToScalar(kBitmapSize),
376 SkIntToScalar(kBitmapSize)) ); 452 SkIntToScalar(kBitmapSize)) );
377 filter = SkRectShaderImageFilter::Create(shader, &cropR); 453 filter = SkPaintImageFilter::Create(paint, &cropR);
378 } 454 }
379 break; 455 break;
380 case DROP_SHADOW: 456 case DROP_SHADOW:
381 filter = SkDropShadowImageFilter::Create(make_scalar(), make_scalar(), m ake_scalar(true), 457 filter = SkDropShadowImageFilter::Create(make_scalar(), make_scalar(), m ake_scalar(true),
382 make_scalar(true), make_color(), make_shadow_mode(), make_im age_filter(), 458 make_scalar(true), make_color(), make_shadow_mode(), make_im age_filter(),
383 nullptr); 459 nullptr);
384 break; 460 break;
385 case MORPHOLOGY: 461 case MORPHOLOGY:
386 if (R(2) == 1) { 462 if (R(2) == 1) {
387 filter = SkDilateImageFilter::Create(R(static_cast<float>(kBitmapSiz e)), 463 filter = SkDilateImageFilter::Create(R(static_cast<float>(kBitmapSiz e)),
(...skipping 26 matching lines...) Expand all
414 SkRTreeFactory factory; 490 SkRTreeFactory factory;
415 SkPictureRecorder recorder; 491 SkPictureRecorder recorder;
416 SkCanvas* recordingCanvas = recorder.beginRecording(SkIntToScalar(kBitma pSize), 492 SkCanvas* recordingCanvas = recorder.beginRecording(SkIntToScalar(kBitma pSize),
417 SkIntToScalar(kBitma pSize), 493 SkIntToScalar(kBitma pSize),
418 &factory, 0); 494 &factory, 0);
419 drawSomething(recordingCanvas); 495 drawSomething(recordingCanvas);
420 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 496 SkAutoTUnref<SkPicture> pict(recorder.endRecording());
421 filter = SkPictureImageFilter::Create(pict.get(), make_rect()); 497 filter = SkPictureImageFilter::Create(pict.get(), make_rect());
422 } 498 }
423 break; 499 break;
500 case PAINT:
501 {
502 SkPaint paint;
503 paint.setHinting(make_paint_hinting());
504 paint.setAntiAlias(make_bool());
505 paint.setDither(make_bool());
506 paint.setLinearText(make_bool());
507 paint.setSubpixelText(make_bool());
508 paint.setLCDRenderText(make_bool());
509 paint.setEmbeddedBitmapText(make_bool());
510 paint.setAutohinted(make_bool());
511 paint.setVerticalText(make_bool());
512 paint.setUnderlineText(make_bool());
513 paint.setStrikeThruText(make_bool());
514 paint.setFakeBoldText(make_bool());
515 paint.setDevKernText(make_bool());
516 paint.setFilterQuality(make_filter_quality());
517 paint.setStyle(make_paint_style());
518 paint.setColor(make_color());
519 paint.setStrokeWidth(make_scalar());
520 paint.setStrokeMiter(make_scalar());
521 paint.setStrokeCap(make_paint_cap());
522 paint.setStrokeJoin(make_paint_join());
523 SkAutoTUnref<SkColorFilter> colorFilter(
524 SkColorFilter::CreateLightingFilter(make_color(), make_color()));
Stephen White 2016/01/07 16:17:33 Not new to this CL, but when it comes to SkColorFi
ajuma 2016/01/08 17:44:28 Done.
525 paint.setColorFilter(colorFilter);
526 paint.setXfermodeMode(make_xfermode());
527 SkAutoTUnref<SkPathEffect> pathEffect(SkCornerPathEffect::Create(make_sc alar()));
Stephen White 2016/01/07 16:17:33 We should be exercising all the serializable path
ajuma 2016/01/08 17:44:28 Done.
528 paint.setPathEffect(pathEffect);
529 SkAutoTUnref<SkMaskFilter> maskFilter(
530 SkBlurMaskFilter::Create(make_blur_style(),
Stephen White 2016/01/07 16:17:33 Also SkEmbossMaskFilter.
ajuma 2016/01/08 17:44:28 Done.
531 make_scalar(),
532 make_blur_mask_filter_flag()));
533 paint.setMaskFilter(maskFilter);
534 SkAutoTUnref<SkTypeface> typeface(
535 SkTypeface::CreateFromName(make_font_name(), make_typeface_style())) ;
536 paint.setTypeface(typeface);
537 SkLayerRasterizer::Builder rasterizerBuilder;
538 SkPaint paintForRasterizer;
539 rasterizerBuilder.addLayer(paintForRasterizer);
540 SkAutoTUnref<SkRasterizer> rasterizer(rasterizerBuilder.detachRasterizer ());
541 paint.setRasterizer(rasterizer);
542 paint.setImageFilter(make_image_filter());
543 SkAutoDataUnref data(make_3Dlut(nullptr, make_bool(), make_bool(), make_ bool()));
544 SkAutoTUnref<SkAnnotation> annotation(
545 SkAnnotation::Create(make_string().c_str(), data));
546 paint.setAnnotation(annotation);
547 paint.setTextAlign(make_paint_align());
548 paint.setTextSize(make_scalar());
549 paint.setTextScaleX(make_scalar());
550 paint.setTextSkewX(make_scalar());
551 paint.setTextEncoding(make_paint_text_encoding());
552 SkImageFilter::CropRect cropR(make_rect());
553 filter = SkPaintImageFilter::Create(paint, &cropR);
554 }
424 default: 555 default:
425 break; 556 break;
426 } 557 }
427 return (filter || canBeNull) ? filter : make_image_filter(canBeNull); 558 return (filter || canBeNull) ? filter : make_image_filter(canBeNull);
428 } 559 }
429 560
430 static SkImageFilter* make_serialized_image_filter() { 561 static SkImageFilter* make_serialized_image_filter() {
431 SkAutoTUnref<SkImageFilter> filter(make_image_filter(false)); 562 SkAutoTUnref<SkImageFilter> filter(make_image_filter(false));
432 SkAutoTUnref<SkData> data(SkValidatingSerializeFlattenable(filter)); 563 SkAutoTUnref<SkData> data(SkValidatingSerializeFlattenable(filter));
433 const unsigned char* ptr = static_cast<const unsigned char*>(data->data()); 564 const unsigned char* ptr = static_cast<const unsigned char*>(data->data());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 } 648 }
518 649
519 private: 650 private:
520 typedef SkView INHERITED; 651 typedef SkView INHERITED;
521 }; 652 };
522 653
523 ////////////////////////////////////////////////////////////////////////////// 654 //////////////////////////////////////////////////////////////////////////////
524 655
525 static SkView* MyFactory() { return new ImageFilterFuzzView; } 656 static SkView* MyFactory() { return new ImageFilterFuzzView; }
526 static SkViewRegister reg(MyFactory); 657 static SkViewRegister reg(MyFactory);
OLDNEW
« no previous file with comments | « include/effects/SkPaintImageFilter.h ('k') | src/effects/SkPaintImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698