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 "sk_tool_utils.h" 10 #include "SkBlurMask.h" 11 #include "SkCanvas.h" 12 #include "SkGraphics.h" 13 #include "SkLayerDrawLooper.h" 14 #include "SkMaskFilter.h" 15 #include "SkRandom.h" 16 17 #define WIDTH 200 18 #define HEIGHT 200 19 20 class DrawLooperGM : public skiagm::GM { 21 public: DrawLooperGM()22 DrawLooperGM() : fLooper(nullptr) { 23 this->setBGColor(0xFFDDDDDD); 24 } 25 26 protected: onISize()27 virtual SkISize onISize() override { 28 return SkISize::Make(520, 160); 29 } 30 onShortName()31 SkString onShortName() override { 32 return SkString("drawlooper"); 33 } 34 onDraw(SkCanvas * canvas)35 void onDraw(SkCanvas* canvas) override { 36 this->init(); 37 38 SkPaint paint; 39 paint.setAntiAlias(true); 40 paint.setLooper(fLooper); 41 42 SkFont font(sk_tool_utils::create_portable_typeface(), 72); 43 44 canvas->drawCircle(50, 50, 30, paint); 45 canvas->drawRect({ 150, 50, 200, 100 }, paint); 46 canvas->drawString("Looper", 230, 100, font, paint); 47 } 48 49 private: 50 sk_sp<SkDrawLooper> fLooper; 51 init()52 void init() { 53 if (fLooper) return; 54 55 constexpr struct { 56 SkColor fColor; 57 SkPaint::Style fStyle; 58 SkScalar fWidth; 59 SkScalar fOffset; 60 SkScalar fBlur; 61 } gParams[] = { 62 { SK_ColorWHITE, SkPaint::kStroke_Style, SkIntToScalar(1)*3/4, 0, 0 }, 63 { SK_ColorRED, SkPaint::kStroke_Style, SkIntToScalar(4), 0, 0 }, 64 { SK_ColorBLUE, SkPaint::kFill_Style, 0, 0, 0 }, 65 { 0x88000000, SkPaint::kFill_Style, 0, SkIntToScalar(10), SkIntToScalar(3) } 66 }; 67 68 SkLayerDrawLooper::Builder looperBuilder; 69 70 SkLayerDrawLooper::LayerInfo info; 71 info.fPaintBits = SkLayerDrawLooper::kStyle_Bit | SkLayerDrawLooper::kMaskFilter_Bit; 72 info.fColorMode = SkBlendMode::kSrc; 73 74 for (size_t i = 0; i < SK_ARRAY_COUNT(gParams); i++) { 75 info.fOffset.set(gParams[i].fOffset, gParams[i].fOffset); 76 SkPaint* paint = looperBuilder.addLayer(info); 77 paint->setColor(gParams[i].fColor); 78 paint->setStyle(gParams[i].fStyle); 79 paint->setStrokeWidth(gParams[i].fWidth); 80 if (gParams[i].fBlur > 0) { 81 paint->setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 82 SkBlurMask::ConvertRadiusToSigma(gParams[i].fBlur))); 83 } 84 } 85 fLooper = looperBuilder.detach(); 86 } 87 88 typedef GM INHERITED; 89 }; 90 91 ////////////////////////////////////////////////////////////////////////////// 92 93 DEF_GM( return new DrawLooperGM; ) 94