1 /* 2 * Copyright 2014 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 8 #include "gm.h" 9 #include "SkColor.h" 10 #include "SkBitmapSource.h" 11 #include "SkBlurImageFilter.h" 12 #include "SkDisplacementMapEffect.h" 13 #include "SkDropShadowImageFilter.h" 14 #include "SkGradientShader.h" 15 #include "SkMorphologyImageFilter.h" 16 #include "SkOffsetImageFilter.h" 17 #include "SkPerlinNoiseShader.h" 18 #include "SkRectShaderImageFilter.h" 19 #include "SkMatrixImageFilter.h" 20 #include "SkScalar.h" 21 22 #define RESIZE_FACTOR_X SkIntToScalar(2) 23 #define RESIZE_FACTOR_Y SkIntToScalar(5) 24 25 namespace skiagm { 26 27 class ImageFiltersClippedGM : public GM { 28 public: 29 ImageFiltersClippedGM() : fInitialized(false) { 30 this->setBGColor(0x00000000); 31 } 32 33 protected: 34 virtual uint32_t onGetFlags() const SK_OVERRIDE { 35 return kSkipTiled_Flag; 36 } 37 38 virtual SkString onShortName() { 39 return SkString("imagefiltersclipped"); 40 } 41 42 virtual SkISize onISize() { 43 return SkISize::Make(860, 500); 44 } 45 46 void make_checkerboard() { 47 fCheckerboard.allocN32Pixels(64, 64); 48 SkCanvas canvas(fCheckerboard); 49 canvas.clear(0x00000000); 50 SkPaint darkPaint; 51 darkPaint.setColor(0xFF404040); 52 SkPaint lightPaint; 53 lightPaint.setColor(0xFFA0A0A0); 54 for (int y = 0; y < 64; y += 16) { 55 for (int x = 0; x < 64; x += 16) { 56 canvas.save(); 57 canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 58 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 59 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 60 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 61 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 62 canvas.restore(); 63 } 64 } 65 } 66 67 void make_gradient_circle(int width, int height) { 68 SkScalar x = SkIntToScalar(width / 2); 69 SkScalar y = SkIntToScalar(height / 2); 70 SkScalar radius = SkMinScalar(x, y) * 0.8f; 71 fGradientCircle.allocN32Pixels(width, height); 72 SkCanvas canvas(fGradientCircle); 73 canvas.clear(0x00000000); 74 SkColor colors[2]; 75 colors[0] = SK_ColorWHITE; 76 colors[1] = SK_ColorBLACK; 77 SkAutoTUnref<SkShader> shader( 78 SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2, 79 SkShader::kClamp_TileMode) 80 ); 81 SkPaint paint; 82 paint.setShader(shader); 83 canvas.drawCircle(x, y, radius, paint); 84 } 85 86 virtual void onDraw(SkCanvas* canvas) { 87 if (!fInitialized) { 88 this->make_checkerboard(); 89 this->make_gradient_circle(64, 64); 90 fInitialized = true; 91 } 92 canvas->clear(0x00000000); 93 94 SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle)); 95 SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard)); 96 SkAutoTUnref<SkShader> noise(SkPerlinNoiseShader::CreateFractalNoise( 97 SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0)); 98 SkMatrix resizeMatrix; 99 resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y); 100 101 SkImageFilter* filters[] = { 102 SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)), 103 SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), 104 SK_ColorGREEN), 105 SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType, 106 SkDisplacementMapEffect::kR_ChannelSelectorType, 107 SkIntToScalar(12), 108 gradient.get(), 109 checkerboard.get()), 110 SkDilateImageFilter::Create(2, 2, checkerboard.get()), 111 SkErodeImageFilter::Create(2, 2, checkerboard.get()), 112 SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)), 113 SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel), 114 SkRectShaderImageFilter::Create(noise), 115 }; 116 117 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 118 SkScalar margin = SkIntToScalar(16); 119 SkRect bounds = r; 120 bounds.outset(margin, margin); 121 122 for (int xOffset = 0; xOffset < 80; xOffset += 16) { 123 canvas->save(); 124 bounds.fLeft = SkIntToScalar(xOffset); 125 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 126 SkPaint paint; 127 paint.setColor(SK_ColorWHITE); 128 paint.setImageFilter(filters[i]); 129 paint.setAntiAlias(true); 130 canvas->save(); 131 canvas->clipRect(bounds); 132 if (5 == i) { 133 canvas->translate(SkIntToScalar(16), SkIntToScalar(-32)); 134 } else if (6 == i) { 135 canvas->scale(SkScalarInvert(RESIZE_FACTOR_X), 136 SkScalarInvert(RESIZE_FACTOR_Y)); 137 } 138 canvas->drawCircle(r.centerX(), r.centerY(), 139 SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 140 canvas->restore(); 141 canvas->translate(r.width() + margin, 0); 142 } 143 canvas->restore(); 144 canvas->translate(0, r.height() + margin); 145 } 146 147 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 148 SkSafeUnref(filters[i]); 149 } 150 } 151 152 private: 153 bool fInitialized; 154 SkBitmap fCheckerboard; 155 SkBitmap fGradientCircle; 156 typedef GM INHERITED; 157 }; 158 159 ////////////////////////////////////////////////////////////////////////////// 160 161 static GM* MyFactory(void*) { return new ImageFiltersClippedGM; } 162 static GMRegistry reg(MyFactory); 163 164 } 165