1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "gm.h" 9 #include "SkBlurMask.h" 10 #include "SkBlurDrawLooper.h" 11 12 namespace skiagm { 13 14 /////////////////////////////////////////////////////////////////////////////// 15 16 static void setup(SkPaint* paint, SkColor c, SkScalar strokeWidth) { 17 paint->setColor(c); 18 if (strokeWidth < 0) { 19 paint->setStyle(SkPaint::kFill_Style); 20 } else { 21 paint->setStyle(SkPaint::kStroke_Style); 22 paint->setStrokeWidth(strokeWidth); 23 } 24 } 25 26 class ShadowsGM : public GM { 27 public: 28 SkPath fCirclePath; 29 SkRect fRect; 30 31 ShadowsGM() { 32 this->setBGColor(0xFFDDDDDD); 33 fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) ); 34 fRect.set(SkIntToScalar(10), SkIntToScalar(10), 35 SkIntToScalar(30), SkIntToScalar(30)); 36 } 37 38 protected: 39 virtual uint32_t onGetFlags() const SK_OVERRIDE { 40 return kSkipTiled_Flag; 41 } 42 43 virtual SkString onShortName() { 44 return SkString("shadows"); 45 } 46 47 virtual SkISize onISize() { 48 return SkISize::Make(200, 120); 49 } 50 51 virtual void onDraw(SkCanvas* canvas) { 52 SkBlurDrawLooper* shadowLoopers[5]; 53 shadowLoopers[0] = 54 SkBlurDrawLooper::Create(SK_ColorBLUE, 55 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)), 56 SkIntToScalar(5), SkIntToScalar(10), 57 SkBlurDrawLooper::kIgnoreTransform_BlurFlag | 58 SkBlurDrawLooper::kOverrideColor_BlurFlag | 59 SkBlurDrawLooper::kHighQuality_BlurFlag); 60 SkAutoUnref aurL0(shadowLoopers[0]); 61 shadowLoopers[1] = 62 SkBlurDrawLooper::Create(SK_ColorBLUE, 63 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)), 64 SkIntToScalar(5), SkIntToScalar(10), 65 SkBlurDrawLooper::kIgnoreTransform_BlurFlag | 66 SkBlurDrawLooper::kOverrideColor_BlurFlag); 67 SkAutoUnref aurL1(shadowLoopers[1]); 68 shadowLoopers[2] = 69 SkBlurDrawLooper::Create(SK_ColorBLACK, 70 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)), 71 SkIntToScalar(5), 72 SkIntToScalar(10), 73 SkBlurDrawLooper::kIgnoreTransform_BlurFlag | 74 SkBlurDrawLooper::kHighQuality_BlurFlag); 75 SkAutoUnref aurL2(shadowLoopers[2]); 76 shadowLoopers[3] = 77 SkBlurDrawLooper::Create(0x7FFF0000, 78 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)), 79 SkIntToScalar(-5), SkIntToScalar(-10), 80 SkBlurDrawLooper::kIgnoreTransform_BlurFlag | 81 SkBlurDrawLooper::kOverrideColor_BlurFlag | 82 SkBlurDrawLooper::kHighQuality_BlurFlag); 83 SkAutoUnref aurL3(shadowLoopers[3]); 84 shadowLoopers[4] = 85 SkBlurDrawLooper::Create(SK_ColorBLACK, SkIntToScalar(0), 86 SkIntToScalar(5), SkIntToScalar(5), 87 SkBlurDrawLooper::kIgnoreTransform_BlurFlag | 88 SkBlurDrawLooper::kOverrideColor_BlurFlag | 89 SkBlurDrawLooper::kHighQuality_BlurFlag); 90 SkAutoUnref aurL4(shadowLoopers[4]); 91 92 static const struct { 93 SkColor fColor; 94 SkScalar fStrokeWidth; 95 } gRec[] = { 96 { SK_ColorRED, -SK_Scalar1 }, 97 { SK_ColorGREEN, SkIntToScalar(4) }, 98 { SK_ColorBLUE, SkIntToScalar(0)}, 99 }; 100 101 SkPaint paint; 102 paint.setAntiAlias(true); 103 for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) { 104 SkAutoCanvasRestore acr(canvas, true); 105 106 paint.setLooper(shadowLoopers[i]); 107 108 canvas->translate(SkIntToScalar((unsigned int)i*40), SkIntToScalar(0)); 109 setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth); 110 canvas->drawRect(fRect, paint); 111 112 canvas->translate(SkIntToScalar(0), SkIntToScalar(40)); 113 setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth); 114 canvas->drawPath(fCirclePath, paint); 115 116 canvas->translate(SkIntToScalar(0), SkIntToScalar(40)); 117 setup(&paint, gRec[2].fColor, gRec[2].fStrokeWidth); 118 canvas->drawPath(fCirclePath, paint); 119 } 120 } 121 122 private: 123 typedef GM INHERITED; 124 }; 125 126 /////////////////////////////////////////////////////////////////////////////// 127 128 static GM* MyFactory(void*) { return new ShadowsGM; } 129 static GMRegistry reg(MyFactory); 130 131 } 132