1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlurTypes.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMaskFilter.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathBuilder.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkBlurMask.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker // This GM exercises the blurred rect nine-patching special cases when the 26*c8dee2aaSAndroid Build Coastguard Worker // blurred rect is very large and/or very far from the origin. 27*c8dee2aaSAndroid Build Coastguard Worker // It creates a large blurred rect/rectori then renders the 4 corners and the 28*c8dee2aaSAndroid Build Coastguard Worker // middle. 29*c8dee2aaSAndroid Build Coastguard Worker class BigBlursGM : public GM { 30*c8dee2aaSAndroid Build Coastguard Worker public: BigBlursGM()31*c8dee2aaSAndroid Build Coastguard Worker BigBlursGM() { 32*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFFDDDDDD); 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const36*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("bigblurs"); } 37*c8dee2aaSAndroid Build Coastguard Worker getISize()38*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(kWidth, kHeight); } 39*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)40*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 41*c8dee2aaSAndroid Build Coastguard Worker constexpr int kBig = 65536; 42*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker const SkRect bigRect = SkRect::MakeWH(SkIntToScalar(kBig), SkIntToScalar(kBig)); 45*c8dee2aaSAndroid Build Coastguard Worker SkRect insetRect = bigRect; 46*c8dee2aaSAndroid Build Coastguard Worker insetRect.inset(20, 20); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker SkPath rectori = SkPathBuilder().addRect(bigRect) 49*c8dee2aaSAndroid Build Coastguard Worker .addRect(insetRect, SkPathDirection::kCCW) 50*c8dee2aaSAndroid Build Coastguard Worker .detach(); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker // The blur extends 3*kSigma out from the big rect. 53*c8dee2aaSAndroid Build Coastguard Worker // Offset the close-up windows so we get the entire blur 54*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kLeftTopPad = 3*kSigma; // use on left & up of big rect 55*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kRightBotPad = kCloseUpSize-3*kSigma; // use on right and bot sides 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker // UL hand corners of the rendered closeups 58*c8dee2aaSAndroid Build Coastguard Worker const SkPoint origins[] = { 59*c8dee2aaSAndroid Build Coastguard Worker { -kLeftTopPad, -kLeftTopPad }, // UL 60*c8dee2aaSAndroid Build Coastguard Worker { kBig-kRightBotPad, -kLeftTopPad }, // UR 61*c8dee2aaSAndroid Build Coastguard Worker { kBig-kRightBotPad, kBig-kRightBotPad }, // LR 62*c8dee2aaSAndroid Build Coastguard Worker { -kLeftTopPad, kBig-kRightBotPad }, // LL 63*c8dee2aaSAndroid Build Coastguard Worker { kBig/2-kCloseUpSize/2, kBig/2-kCloseUpSize/2 }, // center 64*c8dee2aaSAndroid Build Coastguard Worker }; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker SkPaint outlinePaint; 67*c8dee2aaSAndroid Build Coastguard Worker outlinePaint.setColor(SK_ColorRED); 68*c8dee2aaSAndroid Build Coastguard Worker outlinePaint.setStyle(SkPaint::kStroke_Style); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker SkPaint blurPaint; 71*c8dee2aaSAndroid Build Coastguard Worker blurPaint.setAntiAlias(true); 72*c8dee2aaSAndroid Build Coastguard Worker blurPaint.setColor(SK_ColorBLACK); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker int desiredX = 0, desiredY = 0; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 77*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j <= kLastEnum_SkBlurStyle; ++j) { 78*c8dee2aaSAndroid Build Coastguard Worker blurPaint.setMaskFilter(SkMaskFilter::MakeBlur((SkBlurStyle)j, kSigma)); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker for (int k = 0; k < (int)std::size(origins); ++k) { 81*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker SkRect clipRect = SkRect::MakeXYWH(SkIntToScalar(desiredX), 84*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(desiredY), 85*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(kCloseUpSize), 86*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(kCloseUpSize)); 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(clipRect); 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(desiredX-origins[k].fX, 91*c8dee2aaSAndroid Build Coastguard Worker desiredY-origins[k].fY); 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker if (0 == i) { 94*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(bigRect, blurPaint); 95*c8dee2aaSAndroid Build Coastguard Worker } else { 96*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(rectori, blurPaint); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 99*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(clipRect, outlinePaint); 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker desiredX += kCloseUpSize; 102*c8dee2aaSAndroid Build Coastguard Worker } 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker desiredX = 0; 105*c8dee2aaSAndroid Build Coastguard Worker desiredY += kCloseUpSize; 106*c8dee2aaSAndroid Build Coastguard Worker } 107*c8dee2aaSAndroid Build Coastguard Worker } 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker private: 111*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kCloseUpSize = 64; 112*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kWidth = 5 * kCloseUpSize; 113*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kHeight = 2 * (kLastEnum_SkBlurStyle + 1) * kCloseUpSize; 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 116*c8dee2aaSAndroid Build Coastguard Worker }; 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new BigBlursGM;) 119*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 120