Index: samplecode/SampleFilterFuzz.cpp |
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp |
index a0f7aff5ef3ac339d055be7f99d35aef8ed9412a..9d45fa6e07a6fe666194df4727738ce3d29f131c 100644 |
--- a/samplecode/SampleFilterFuzz.cpp |
+++ b/samplecode/SampleFilterFuzz.cpp |
@@ -5,32 +5,46 @@ |
* found in the LICENSE file. |
*/ |
#include "SampleCode.h" |
+#include "Sk1DPathEffect.h" |
+#include "Sk2DPathEffect.h" |
#include "SkAlphaThresholdFilter.h" |
+#include "SkArcToPathEffect.h" |
+#include "SkAnnotation.h" |
#include "SkBlurImageFilter.h" |
+#include "SkBlurMaskFilter.h" |
#include "SkCanvas.h" |
#include "SkColorCubeFilter.h" |
#include "SkColorFilter.h" |
#include "SkColorFilterImageFilter.h" |
+#include "SkColorMatrixFilter.h" |
#include "SkComposeImageFilter.h" |
+#include "SkCornerPathEffect.h" |
+#include "SkDashPathEffect.h" |
#include "SkData.h" |
+#include "SkDiscretePathEffect.h" |
#include "SkDisplacementMapEffect.h" |
#include "SkDropShadowImageFilter.h" |
+#include "SkEmbossMaskFilter.h" |
#include "SkFlattenableSerialization.h" |
#include "SkImageSource.h" |
+#include "SkLayerRasterizer.h" |
#include "SkLightingImageFilter.h" |
+#include "SkLumaColorFilter.h" |
#include "SkMagnifierImageFilter.h" |
#include "SkMatrixConvolutionImageFilter.h" |
#include "SkMergeImageFilter.h" |
#include "SkMorphologyImageFilter.h" |
#include "SkOffsetImageFilter.h" |
+#include "SkPaintImageFilter.h" |
#include "SkPerlinNoiseShader.h" |
#include "SkPictureImageFilter.h" |
#include "SkPictureRecorder.h" |
#include "SkPoint3.h" |
#include "SkRandom.h" |
-#include "SkRectShaderImageFilter.h" |
+#include "SkTableColorFilter.h" |
#include "SkTestImageFilters.h" |
#include "SkTileImageFilter.h" |
+#include "SkTypeface.h" |
#include "SkView.h" |
#include "SkXfermodeImageFilter.h" |
#include <stdio.h> |
@@ -94,6 +108,36 @@ static SkScalar make_scalar(bool positiveOnly = false) { |
return make_number(positiveOnly); |
} |
+static SkString make_string() { |
+ int length = R(1000); |
+ SkString str(length); |
+ for (int i = 0; i < length; ++i) { |
+ str[i] = static_cast<char>(R(256)); |
+ } |
+ return str; |
+} |
+ |
+static SkString make_font_name() { |
+ int sel = R(8); |
+ |
+ switch(sel) { |
+ case 0: return SkString("Courier New"); |
+ case 1: return SkString("Helvetica"); |
+ case 2: return SkString("monospace"); |
+ case 3: return SkString("sans-serif"); |
+ case 4: return SkString("serif"); |
+ case 5: return SkString("Times"); |
+ case 6: return SkString("Times New Roman"); |
+ case 7: |
+ default: |
+ return make_string(); |
+ } |
+} |
+ |
+static bool make_bool() { |
+ return R(2) == 1; |
+} |
+ |
static SkRect make_rect() { |
return SkRect::MakeWH(SkIntToScalar(R(static_cast<float>(kBitmapSize))), |
SkIntToScalar(R(static_cast<float>(kBitmapSize)))); |
@@ -119,6 +163,50 @@ static SkXfermode::Mode make_xfermode() { |
return static_cast<SkXfermode::Mode>(R(SkXfermode::kLastMode+1)); |
} |
+static SkPaint::Align make_paint_align() { |
+ return static_cast<SkPaint::Align>(R(SkPaint::kRight_Align+1)); |
+} |
+ |
+static SkPaint::Hinting make_paint_hinting() { |
+ return static_cast<SkPaint::Hinting>(R(SkPaint::kFull_Hinting+1)); |
+} |
+ |
+static SkPaint::Style make_paint_style() { |
+ return static_cast<SkPaint::Style>(R(SkPaint::kStrokeAndFill_Style+1)); |
+} |
+ |
+static SkPaint::Cap make_paint_cap() { |
+ return static_cast<SkPaint::Cap>(R(SkPaint::kDefault_Cap+1)); |
+} |
+ |
+static SkPaint::Join make_paint_join() { |
+ return static_cast<SkPaint::Join>(R(SkPaint::kDefault_Join+1)); |
+} |
+ |
+static SkPaint::TextEncoding make_paint_text_encoding() { |
+ return static_cast<SkPaint::TextEncoding>(R(SkPaint::kGlyphID_TextEncoding+1)); |
+} |
+ |
+static SkBlurStyle make_blur_style() { |
+ return static_cast<SkBlurStyle>(R(kLastEnum_SkBlurStyle+1)); |
+} |
+ |
+static SkBlurMaskFilter::BlurFlags make_blur_mask_filter_flag() { |
+ return static_cast<SkBlurMaskFilter::BlurFlags>(R(SkBlurMaskFilter::kAll_BlurFlag+1)); |
+} |
+ |
+static SkFilterQuality make_filter_quality() { |
+ return static_cast<SkFilterQuality>(R(kHigh_SkFilterQuality+1)); |
+} |
+ |
+static SkTypeface::Style make_typeface_style() { |
+ return static_cast<SkTypeface::Style>(R(SkTypeface::kBoldItalic+1)); |
+} |
+ |
+static SkPath1DPathEffect::Style make_path_1d_path_effect_style() { |
+ return static_cast<SkPath1DPathEffect::Style>(R(SkPath1DPathEffect::kStyleCount)); |
+} |
+ |
static SkColor make_color() { |
return (R(2) == 1) ? 0xFFC0F0A0 : 0xFF000090; |
} |
@@ -257,7 +345,213 @@ static void drawSomething(SkCanvas* canvas) { |
canvas->drawText("Picture", 7, SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/4), paint); |
} |
-static SkImageFilter* make_image_filter(bool canBeNull = true) { |
+static void rand_color_table(uint8_t* table) { |
+ for (int i = 0; i < 256; ++i) { |
+ table[i] = R(256); |
+ } |
+} |
+ |
+static SkColorFilter* make_color_filter() { |
+ SkColorFilter* colorFilter; |
+ switch (R(6)) { |
+ case 0: { |
+ SkScalar array[20]; |
+ for (int i = 0; i < 20; ++i) { |
+ array[i] = make_scalar(); |
+ } |
+ colorFilter = SkColorMatrixFilter::Create(array); |
+ break; |
+ } |
+ case 1: |
+ colorFilter = SkLumaColorFilter::Create(); |
+ break; |
+ case 2: { |
+ uint8_t tableA[256]; |
+ uint8_t tableR[256]; |
+ uint8_t tableG[256]; |
+ uint8_t tableB[256]; |
+ rand_color_table(tableA); |
+ rand_color_table(tableR); |
+ rand_color_table(tableG); |
+ rand_color_table(tableB); |
+ colorFilter = SkTableColorFilter::CreateARGB(tableA, tableR, tableG, tableB); |
+ break; |
+ } |
+ case 3: |
+ colorFilter = SkColorFilter::CreateModeFilter(make_color(), make_xfermode()); |
+ break; |
+ case 4: |
+ colorFilter = SkColorFilter::CreateLightingFilter(make_color(), make_color()); |
+ break; |
+ case 5: |
+ default: |
+ colorFilter = nullptr; |
+ break; |
+ } |
+ return colorFilter; |
+} |
+ |
+static SkPath make_path() { |
+ SkPath path; |
+ int numOps = R(30); |
+ for (int i = 0; i < numOps; ++i) { |
+ switch (R(6)) { |
+ case 0: |
+ path.moveTo(make_scalar(), make_scalar()); |
+ break; |
+ case 1: |
+ path.lineTo(make_scalar(), make_scalar()); |
+ break; |
+ case 2: |
+ path.quadTo(make_scalar(), make_scalar(), make_scalar(), make_scalar()); |
+ break; |
+ case 3: |
+ path.conicTo(make_scalar(), make_scalar(), make_scalar(), make_scalar(), make_scalar()); |
+ break; |
+ case 4: |
+ path.cubicTo(make_scalar(), make_scalar(), make_scalar(), |
+ make_scalar(), make_scalar(), make_scalar()); |
+ break; |
+ case 5: |
+ default: |
+ path.arcTo(make_scalar(), make_scalar(), make_scalar(), make_scalar(), make_scalar()); |
+ break; |
+ |
+ } |
+ } |
+ path.close(); |
+ return path; |
+} |
+ |
+static SkPathEffect* make_path_effect(bool canBeNull = true) { |
+ SkPathEffect* pathEffect = nullptr; |
+ if (canBeNull && (R(3) == 1)) { return pathEffect; } |
+ |
+ switch (R(9)) { |
+ case 0: |
+ pathEffect = SkArcToPathEffect::Create(make_scalar(true)); |
+ break; |
+ case 1: { |
+ SkAutoTUnref<SkPathEffect> outer(make_path_effect(false)); |
+ SkAutoTUnref<SkPathEffect> inner(make_path_effect(false)); |
+ pathEffect = SkComposePathEffect::Create(outer, inner); |
+ break; |
+ } |
+ case 2: |
+ pathEffect = SkCornerPathEffect::Create(make_scalar()); |
+ break; |
+ case 3: { |
+ int count = R(10); |
+ SkScalar intervals[10]; |
+ for (int i = 0; i < count; ++i) { |
+ intervals[i] = make_scalar(); |
+ } |
+ pathEffect = SkDashPathEffect::Create(intervals, count, make_scalar()); |
+ break; |
+ } |
+ case 4: |
+ pathEffect = SkDiscretePathEffect::Create(make_scalar(), make_scalar()); |
+ break; |
+ case 5: |
+ pathEffect = SkPath1DPathEffect::Create(make_path(), |
+ make_scalar(), |
+ make_scalar(), |
+ make_path_1d_path_effect_style()); |
+ break; |
+ case 6: |
+ pathEffect = SkLine2DPathEffect::Create(make_scalar(), make_matrix()); |
+ break; |
+ case 7: |
+ pathEffect = SkPath2DPathEffect::Create(make_matrix(), make_path()); |
+ break; |
+ case 8: |
+ default: |
+ pathEffect = SkSumPathEffect::Create(make_path_effect(false), |
+ make_path_effect(false)); |
+ break; |
+ } |
+ return pathEffect; |
+} |
+ |
+static SkMaskFilter* make_mask_filter() { |
+ SkMaskFilter* maskFilter; |
+ switch (R(3)) { |
+ case 0: |
+ maskFilter = SkBlurMaskFilter::Create(make_blur_style(), |
+ make_scalar(), |
+ make_blur_mask_filter_flag()); |
+ case 1: { |
+ SkEmbossMaskFilter::Light light; |
+ for (int i = 0; i < 3; ++i) { |
+ light.fDirection[i] = make_scalar(); |
+ } |
+ light.fPad = R(65536); |
+ light.fAmbient = R(256); |
+ light.fSpecular = R(256); |
+ maskFilter = SkEmbossMaskFilter::Create(make_scalar(), |
+ light); |
+ } |
+ case 2: |
+ default: |
+ maskFilter = nullptr; |
+ break; |
+ } |
+ return maskFilter; |
+} |
+ |
+static SkImageFilter* make_image_filter(bool canBeNull = true); |
+ |
+static SkPaint make_paint() { |
+ SkPaint paint; |
+ paint.setHinting(make_paint_hinting()); |
+ paint.setAntiAlias(make_bool()); |
+ paint.setDither(make_bool()); |
+ paint.setLinearText(make_bool()); |
+ paint.setSubpixelText(make_bool()); |
+ paint.setLCDRenderText(make_bool()); |
+ paint.setEmbeddedBitmapText(make_bool()); |
+ paint.setAutohinted(make_bool()); |
+ paint.setVerticalText(make_bool()); |
+ paint.setUnderlineText(make_bool()); |
+ paint.setStrikeThruText(make_bool()); |
+ paint.setFakeBoldText(make_bool()); |
+ paint.setDevKernText(make_bool()); |
+ paint.setFilterQuality(make_filter_quality()); |
+ paint.setStyle(make_paint_style()); |
+ paint.setColor(make_color()); |
+ paint.setStrokeWidth(make_scalar()); |
+ paint.setStrokeMiter(make_scalar()); |
+ paint.setStrokeCap(make_paint_cap()); |
+ paint.setStrokeJoin(make_paint_join()); |
+ paint.setColorFilter(make_color_filter()); |
+ paint.setXfermodeMode(make_xfermode()); |
+ paint.setPathEffect(make_path_effect()); |
+ paint.setMaskFilter(make_mask_filter()); |
+ SkAutoTUnref<SkTypeface> typeface( |
+ SkTypeface::CreateFromName(make_font_name().c_str(), make_typeface_style())); |
+ paint.setTypeface(typeface); |
+ SkLayerRasterizer::Builder rasterizerBuilder; |
+ SkPaint paintForRasterizer; |
+ if (R(2) == 1) { |
+ paintForRasterizer = make_paint(); |
ajuma
2016/01/08 19:09:08
Made this paint random too.
|
+ } |
+ rasterizerBuilder.addLayer(paintForRasterizer); |
+ SkAutoTUnref<SkRasterizer> rasterizer(rasterizerBuilder.detachRasterizer()); |
+ paint.setRasterizer(rasterizer); |
+ paint.setImageFilter(make_image_filter()); |
+ SkAutoDataUnref data(make_3Dlut(nullptr, make_bool(), make_bool(), make_bool())); |
+ SkAutoTUnref<SkAnnotation> annotation( |
+ SkAnnotation::Create(make_string().c_str(), data)); |
+ paint.setAnnotation(annotation); |
+ paint.setTextAlign(make_paint_align()); |
+ paint.setTextSize(make_scalar()); |
+ paint.setTextScaleX(make_scalar()); |
+ paint.setTextSkewX(make_scalar()); |
+ paint.setTextEncoding(make_paint_text_encoding()); |
+ return paint; |
+} |
+ |
+static SkImageFilter* make_image_filter(bool canBeNull) { |
SkImageFilter* filter = 0; |
// Add a 1 in 3 chance to get a nullptr input |
@@ -266,7 +560,7 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
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 }; |
+ MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, PAINT, NUM_FILTERS }; |
switch (R(NUM_FILTERS)) { |
case ALPHA_THRESHOLD: |
@@ -277,9 +571,7 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
break; |
case COLOR: |
{ |
- SkAutoTUnref<SkColorFilter> cf((R(2) == 1) ? |
- SkColorFilter::CreateModeFilter(make_color(), make_xfermode()) : |
- SkColorFilter::CreateLightingFilter(make_color(), make_color())); |
+ SkAutoTUnref<SkColorFilter> cf(make_color_filter()); |
filter = cf.get() ? SkColorFilterImageFilter::Create(cf, make_image_filter()) : 0; |
} |
break; |
@@ -372,9 +664,11 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
make_scalar(true), make_scalar(true), R(10.0f), make_scalar()) : |
SkPerlinNoiseShader::CreateTurbulence( |
make_scalar(true), make_scalar(true), R(10.0f), make_scalar())); |
+ SkPaint paint; |
+ paint.setShader(shader); |
SkImageFilter::CropRect cropR(SkRect::MakeWH(SkIntToScalar(kBitmapSize), |
SkIntToScalar(kBitmapSize))); |
- filter = SkRectShaderImageFilter::Create(shader, &cropR); |
+ filter = SkPaintImageFilter::Create(paint, &cropR); |
} |
break; |
case DROP_SHADOW: |
@@ -421,6 +715,11 @@ static SkImageFilter* make_image_filter(bool canBeNull = true) { |
filter = SkPictureImageFilter::Create(pict.get(), make_rect()); |
} |
break; |
+ case PAINT: |
+ { |
+ SkImageFilter::CropRect cropR(make_rect()); |
+ filter = SkPaintImageFilter::Create(make_paint(), &cropR); |
+ } |
default: |
break; |
} |