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 "SkLightingImageFilter.h" 16 #include "SkMorphologyImageFilter.h" 17 #include "SkOffsetImageFilter.h" 18 #include "SkPerlinNoiseShader.h" 19 #include "SkRectShaderImageFilter.h" 20 #include "SkMatrixImageFilter.h" 21 #include "SkScalar.h" 22 23 #define RESIZE_FACTOR SkIntToScalar(4) 24 25 namespace skiagm { 26 27 class ImageFiltersScaledGM : public GM { 28 public: 29 ImageFiltersScaledGM() : 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("imagefiltersscaled"); 40 } 41 42 virtual SkISize onISize() { 43 return SkISize::Make(1428, 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 = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); 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 99 SkPoint3 pointLocation(0, 0, SkIntToScalar(10)); 100 SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20)); 101 SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0); 102 SkScalar spotExponent = SK_Scalar1; 103 SkScalar cutoffAngle = SkIntToScalar(15); 104 SkScalar kd = SkIntToScalar(2); 105 SkScalar surfaceScale = SkIntToScalar(1); 106 SkColor white(0xFFFFFFFF); 107 SkMatrix resizeMatrix; 108 resizeMatrix.setScale(RESIZE_FACTOR, RESIZE_FACTOR); 109 110 SkImageFilter* filters[] = { 111 SkBlurImageFilter::Create(SkIntToScalar(4), SkIntToScalar(4)), 112 SkDropShadowImageFilter::Create(SkIntToScalar(5), SkIntToScalar(10), SkIntToScalar(3), 113 SK_ColorYELLOW), 114 SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType, 115 SkDisplacementMapEffect::kR_ChannelSelectorType, 116 SkIntToScalar(12), 117 gradient.get(), 118 checkerboard.get()), 119 SkDilateImageFilter::Create(1, 1, checkerboard.get()), 120 SkErodeImageFilter::Create(1, 1, checkerboard.get()), 121 SkOffsetImageFilter::Create(SkIntToScalar(32), 0), 122 SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel), 123 SkRectShaderImageFilter::Create(noise), 124 SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd), 125 SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, 126 cutoffAngle, white, surfaceScale, kd), 127 }; 128 129 SkVector scales[] = { 130 SkVector::Make(SkScalarInvert(2), SkScalarInvert(2)), 131 SkVector::Make(SkIntToScalar(1), SkIntToScalar(1)), 132 SkVector::Make(SkIntToScalar(1), SkIntToScalar(2)), 133 SkVector::Make(SkIntToScalar(2), SkIntToScalar(1)), 134 SkVector::Make(SkIntToScalar(2), SkIntToScalar(2)), 135 }; 136 137 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 138 SkScalar margin = SkIntToScalar(16); 139 SkRect bounds = r; 140 bounds.outset(margin, margin); 141 142 for (size_t j = 0; j < SK_ARRAY_COUNT(scales); ++j) { 143 canvas->save(); 144 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 145 SkPaint paint; 146 paint.setColor(SK_ColorBLUE); 147 paint.setImageFilter(filters[i]); 148 paint.setAntiAlias(true); 149 canvas->save(); 150 canvas->scale(scales[j].fX, scales[j].fY); 151 if (5 == i) { 152 canvas->translate(SkIntToScalar(-32), 0); 153 } else if (6 == i) { 154 canvas->scale(SkScalarInvert(RESIZE_FACTOR), 155 SkScalarInvert(RESIZE_FACTOR)); 156 } 157 canvas->drawCircle(r.centerX(), r.centerY(), 158 SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint); 159 canvas->restore(); 160 canvas->translate(r.width() * scales[j].fX + margin, 0); 161 } 162 canvas->restore(); 163 canvas->translate(0, r.height() * scales[j].fY + margin); 164 } 165 166 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 167 filters[i]->unref(); 168 } 169 } 170 171 private: 172 bool fInitialized; 173 SkBitmap fCheckerboard; 174 SkBitmap fGradientCircle; 175 typedef GM INHERITED; 176 }; 177 178 ////////////////////////////////////////////////////////////////////////////// 179 180 static GM* MyFactory(void*) { return new ImageFiltersScaledGM; } 181 static GMRegistry reg(MyFactory); 182 183 } 184