1 /* 2 * Copyright 2011 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 "SkBlurMask.h" 10 #include "SkBlurMaskFilter.h" 11 12 class BlursGM : public skiagm::GM { 13 public: BlursGM()14 BlursGM() { 15 this->setBGColor(0xFFDDDDDD); 16 } 17 18 protected: 19 onShortName()20 SkString onShortName() override { 21 return SkString("blurs"); 22 } 23 onISize()24 SkISize onISize() override { 25 return SkISize::Make(700, 500); 26 } 27 onDraw(SkCanvas * canvas)28 void onDraw(SkCanvas* canvas) override { 29 SkBlurStyle NONE = SkBlurStyle(-999); 30 static const struct { 31 SkBlurStyle fStyle; 32 int fCx, fCy; 33 } gRecs[] = { 34 { NONE, 0, 0 }, 35 { kInner_SkBlurStyle, -1, 0 }, 36 { kNormal_SkBlurStyle, 0, 1 }, 37 { kSolid_SkBlurStyle, 0, -1 }, 38 { kOuter_SkBlurStyle, 1, 0 }, 39 }; 40 41 SkPaint paint; 42 paint.setAntiAlias(true); 43 sk_tool_utils::set_portable_typeface(&paint); 44 paint.setTextSize(SkIntToScalar(25)); 45 canvas->translate(SkIntToScalar(-40), SkIntToScalar(0)); 46 47 SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag; 48 for (int j = 0; j < 2; j++) { 49 canvas->save(); 50 paint.setColor(SK_ColorBLUE); 51 for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) { 52 if (gRecs[i].fStyle != NONE) { 53 SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle, 54 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)), 55 flags); 56 paint.setMaskFilter(mf)->unref(); 57 } else { 58 paint.setMaskFilter(NULL); 59 } 60 canvas->drawCircle(SkIntToScalar(200 + gRecs[i].fCx*100), 61 SkIntToScalar(200 + gRecs[i].fCy*100), 62 SkIntToScalar(50), 63 paint); 64 } 65 // draw text 66 { 67 SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle, 68 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)), 69 flags); 70 paint.setMaskFilter(mf)->unref(); 71 SkScalar x = SkIntToScalar(70); 72 SkScalar y = SkIntToScalar(400); 73 paint.setColor(SK_ColorBLACK); 74 canvas->drawText("Hamburgefons Style", 18, x, y, paint); 75 canvas->drawText("Hamburgefons Style", 18, 76 x, y + SkIntToScalar(50), paint); 77 paint.setMaskFilter(NULL); 78 paint.setColor(SK_ColorWHITE); 79 x -= SkIntToScalar(2); 80 y -= SkIntToScalar(2); 81 canvas->drawText("Hamburgefons Style", 18, x, y, paint); 82 } 83 canvas->restore(); 84 flags = SkBlurMaskFilter::kHighQuality_BlurFlag; 85 canvas->translate(SkIntToScalar(350), SkIntToScalar(0)); 86 } 87 } 88 89 private: 90 typedef skiagm::GM INHERITED; 91 }; 92 DEF_GM( return new BlursGM; ) 93 94 ////////////////////////////////////////////////////////////////////////////////////////////// 95 96 // exercise a special-case of blurs, which is two nested rects. These are drawn specially, 97 // and possibly cached. 98 // 99 // in particular, we want to notice that the 2nd rect draws slightly differently, since it 100 // is translated a fractional amount. 101 // 102 class Blur2RectsGM : public skiagm::GM { 103 public: onShortName()104 SkString onShortName() override { 105 return SkString("blur2rects"); 106 } 107 onISize()108 SkISize onISize() override { 109 return SkISize::Make(700, 500); 110 } 111 onDraw(SkCanvas * canvas)112 void onDraw(SkCanvas* canvas) override { 113 SkPaint paint; 114 115 paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, 116 2.3f))->unref(); 117 118 SkRect outer = SkRect::MakeXYWH(10.125f, 10.125f, 100.125f, 100); 119 SkRect inner = SkRect::MakeXYWH(20.25f, 20.125f, 80, 80); 120 SkPath path; 121 path.addRect(outer, SkPath::kCW_Direction); 122 path.addRect(inner, SkPath::kCCW_Direction); 123 124 canvas->drawPath(path, paint); 125 // important to translate by a factional amount to exercise a different "phase" 126 // of the same path w.r.t. the pixel grid 127 SkScalar dx = SkScalarRoundToScalar(path.getBounds().width()) + 14 + 0.25f; 128 canvas->translate(dx, 0); 129 canvas->drawPath(path, paint); 130 } 131 }; 132 DEF_GM( return new Blur2RectsGM; ) 133 134 class Blur2RectsNonNinePatchGM : public skiagm::GM { 135 public: onShortName()136 SkString onShortName() override { 137 return SkString("blur2rectsnonninepatch"); 138 } 139 onISize()140 SkISize onISize() override { 141 return SkISize::Make(700, 500); 142 } 143 onDraw(SkCanvas * canvas)144 void onDraw(SkCanvas* canvas) override { 145 SkPaint paint; 146 paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, 147 4.3f))->unref(); 148 149 SkRect outer = SkRect::MakeXYWH(10, 110, 100, 100); 150 SkRect inner = SkRect::MakeXYWH(50, 150, 10, 10); 151 SkPath path; 152 path.addRect(outer, SkPath::kCW_Direction); 153 path.addRect(inner, SkPath::kCW_Direction); 154 canvas->drawPath(path, paint); 155 156 SkScalar dx = SkScalarRoundToScalar(path.getBounds().width()) + 40 + 0.25f; 157 canvas->translate(dx, 0); 158 canvas->drawPath(path, paint); 159 160 // Translate to outside of clip bounds. 161 canvas->translate(-dx, 0); 162 canvas->translate(-30, -150); 163 canvas->drawPath(path, paint); 164 } 165 }; 166 DEF_GM( return new Blur2RectsNonNinePatchGM; ) 167