1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BD-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/SkFont.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMaskFilter.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkBlurMask.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker // This GM tests out the SkBlurMaskFilter's kIgnoreTransform flag. That flag causes the blur mask 28*c8dee2aaSAndroid Build Coastguard Worker // filter to not apply the CTM to the blur's radius. 29*c8dee2aaSAndroid Build Coastguard Worker class BlurIgnoreXformGM : public skiagm::GM { 30*c8dee2aaSAndroid Build Coastguard Worker public: 31*c8dee2aaSAndroid Build Coastguard Worker enum class DrawType { 32*c8dee2aaSAndroid Build Coastguard Worker kCircle, 33*c8dee2aaSAndroid Build Coastguard Worker kRect, 34*c8dee2aaSAndroid Build Coastguard Worker kRRect, 35*c8dee2aaSAndroid Build Coastguard Worker }; 36*c8dee2aaSAndroid Build Coastguard Worker BlurIgnoreXformGM(DrawType drawType)37*c8dee2aaSAndroid Build Coastguard Worker BlurIgnoreXformGM(DrawType drawType) : fDrawType(drawType) { } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker protected: runAsBench() const40*c8dee2aaSAndroid Build Coastguard Worker bool runAsBench() const override { return true; } 41*c8dee2aaSAndroid Build Coastguard Worker getName() const42*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { 43*c8dee2aaSAndroid Build Coastguard Worker SkString name; 44*c8dee2aaSAndroid Build Coastguard Worker name.printf("blur_ignore_xform_%s", 45*c8dee2aaSAndroid Build Coastguard Worker DrawType::kCircle == fDrawType ? "circle" 46*c8dee2aaSAndroid Build Coastguard Worker : DrawType::kRect == fDrawType ? "rect" : "rrect"); 47*c8dee2aaSAndroid Build Coastguard Worker return name; 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker getISize()50*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(375, 475); } 51*c8dee2aaSAndroid Build Coastguard Worker onOnceBeforeDraw()52*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 53*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumBlurs; ++i) { 54*c8dee2aaSAndroid Build Coastguard Worker fBlurFilters[i] = SkMaskFilter::MakeBlur( 55*c8dee2aaSAndroid Build Coastguard Worker kNormal_SkBlurStyle, 56*c8dee2aaSAndroid Build Coastguard Worker SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)), 57*c8dee2aaSAndroid Build Coastguard Worker kBlurFlags[i].fRespectCTM); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)61*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 62*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 63*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorBLACK); 64*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 25); 67*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 68*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(80, 0); 69*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < kNumBlurs; ++i) { 70*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore autoRestore(canvas, true); 71*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SkIntToScalar(i * 150), 0); 72*c8dee2aaSAndroid Build Coastguard Worker for (auto scale : kMatrixScales) { 73*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 74*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(scale.fScale, scale.fScale); 75*c8dee2aaSAndroid Build Coastguard Worker static const SkScalar kRadius = 20.0f; 76*c8dee2aaSAndroid Build Coastguard Worker SkScalar coord = 50.0f * 1.0f / scale.fScale; 77*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::MakeXYWH(coord - kRadius , coord - kRadius, 78*c8dee2aaSAndroid Build Coastguard Worker 2 * kRadius, 2 * kRadius); 79*c8dee2aaSAndroid Build Coastguard Worker SkRRect rrect = SkRRect::MakeRectXY(rect, kRadius/2.0f, kRadius/2.0f); 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker paint.setMaskFilter(fBlurFilters[i]); 82*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < 2; ++j) { 83*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 84*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 * (1 - j), 10 * (1 - j)); 85*c8dee2aaSAndroid Build Coastguard Worker if (DrawType::kCircle == fDrawType) { 86*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(coord, coord, kRadius, paint); 87*c8dee2aaSAndroid Build Coastguard Worker } else if (DrawType::kRect == fDrawType) { 88*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(rect, paint); 89*c8dee2aaSAndroid Build Coastguard Worker } else { 90*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRRect(rrect, paint); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker paint.setMaskFilter(nullptr); 93*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 96*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, SkIntToScalar(150)); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 100*c8dee2aaSAndroid Build Coastguard Worker if (kBench_Mode != this->getMode()) { 101*c8dee2aaSAndroid Build Coastguard Worker this->drawOverlay(canvas); 102*c8dee2aaSAndroid Build Coastguard Worker } 103*c8dee2aaSAndroid Build Coastguard Worker } 104*c8dee2aaSAndroid Build Coastguard Worker drawOverlay(SkCanvas * canvas)105*c8dee2aaSAndroid Build Coastguard Worker void drawOverlay(SkCanvas* canvas) { 106*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 0); 107*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultPortableFont(); 108*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 109*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumBlurs; ++i) { 110*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(kBlurFlags[i].fName, 100, 0, font, SkPaint()); 111*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SkIntToScalar(130), 0); 112*c8dee2aaSAndroid Build Coastguard Worker } 113*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 114*c8dee2aaSAndroid Build Coastguard Worker for (auto scale : kMatrixScales) { 115*c8dee2aaSAndroid Build Coastguard Worker canvas->drawString(scale.fName, 0, 50, font, SkPaint()); 116*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, SkIntToScalar(150)); 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker } 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker private: 121*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kNumBlurs = 2; 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker static const struct BlurFlags { 124*c8dee2aaSAndroid Build Coastguard Worker bool fRespectCTM; 125*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 126*c8dee2aaSAndroid Build Coastguard Worker } kBlurFlags[kNumBlurs]; 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker static const struct MatrixScale { 129*c8dee2aaSAndroid Build Coastguard Worker float fScale; 130*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 131*c8dee2aaSAndroid Build Coastguard Worker } kMatrixScales[3]; 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker DrawType fDrawType; 134*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkMaskFilter> fBlurFilters[kNumBlurs]; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM; 137*c8dee2aaSAndroid Build Coastguard Worker }; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker const BlurIgnoreXformGM::BlurFlags BlurIgnoreXformGM::kBlurFlags[] = { 140*c8dee2aaSAndroid Build Coastguard Worker {true, "none"}, 141*c8dee2aaSAndroid Build Coastguard Worker {false, "IgnoreTransform"} 142*c8dee2aaSAndroid Build Coastguard Worker }; 143*c8dee2aaSAndroid Build Coastguard Worker 144*c8dee2aaSAndroid Build Coastguard Worker const BlurIgnoreXformGM::MatrixScale BlurIgnoreXformGM::kMatrixScales[] = { 145*c8dee2aaSAndroid Build Coastguard Worker {1.0f, "Identity"}, 146*c8dee2aaSAndroid Build Coastguard Worker {0.5f, "Scale = 0.5"}, 147*c8dee2aaSAndroid Build Coastguard Worker {2.0f, "Scale = 2.0"} 148*c8dee2aaSAndroid Build Coastguard Worker }; 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kCircle);) 151*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRect);) 152*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRRect);) 153