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/gm.h" 9 #include "include/core/SkCanvas.h" 10 #include "include/core/SkColor.h" 11 #include "include/core/SkMatrix.h" 12 #include "include/core/SkPaint.h" 13 #include "include/core/SkPathBuilder.h" 14 #include "include/core/SkPoint.h" 15 #include "include/core/SkRect.h" 16 #include "include/core/SkScalar.h" 17 #include "include/core/SkShader.h" 18 #include "include/core/SkSize.h" 19 #include "include/core/SkString.h" 20 #include "include/core/SkTileMode.h" 21 #include "include/core/SkTypes.h" 22 #include "include/effects/SkGradientShader.h" 23 24 namespace skiagm { 25 26 class FillTypePerspGM : public GM { 27 SkPath fPath; 28 public: FillTypePerspGM()29 FillTypePerspGM() {} 30 makePath()31 void makePath() { 32 if (fPath.isEmpty()) { 33 const SkScalar radius = SkIntToScalar(45); 34 fPath = SkPathBuilder().addCircle(SkIntToScalar(50), SkIntToScalar(50), radius) 35 .addCircle(SkIntToScalar(100), SkIntToScalar(100), radius) 36 .detach(); 37 } 38 } 39 40 protected: getName() const41 SkString getName() const override { return SkString("filltypespersp"); } 42 getISize()43 SkISize getISize() override { return SkISize::Make(835, 840); } 44 showPath(SkCanvas * canvas,int x,int y,SkPathFillType ft,SkScalar scale,const SkPaint & paint)45 void showPath(SkCanvas* canvas, int x, int y, SkPathFillType ft, 46 SkScalar scale, const SkPaint& paint) { 47 const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) }; 48 49 canvas->save(); 50 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 51 canvas->clipRect(r); 52 canvas->drawColor(SK_ColorWHITE); 53 fPath.setFillType(ft); 54 canvas->translate(r.centerX(), r.centerY()); 55 canvas->scale(scale, scale); 56 canvas->translate(-r.centerX(), -r.centerY()); 57 canvas->drawPath(fPath, paint); 58 canvas->restore(); 59 } 60 showFour(SkCanvas * canvas,SkScalar scale,bool aa)61 void showFour(SkCanvas* canvas, SkScalar scale, bool aa) { 62 SkPaint paint; 63 SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100)); 64 SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN}; 65 SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1}; 66 paint.setShader(SkGradientShader::MakeRadial(center, 67 SkIntToScalar(100), 68 colors, 69 pos, 70 std::size(colors), 71 SkTileMode::kClamp)); 72 paint.setAntiAlias(aa); 73 74 showPath(canvas, 0, 0, SkPathFillType::kWinding, 75 scale, paint); 76 showPath(canvas, 200, 0, SkPathFillType::kEvenOdd, 77 scale, paint); 78 showPath(canvas, 00, 200, SkPathFillType::kInverseWinding, 79 scale, paint); 80 showPath(canvas, 200, 200, SkPathFillType::kInverseEvenOdd, 81 scale, paint); 82 } 83 onDraw(SkCanvas * canvas)84 void onDraw(SkCanvas* canvas) override { 85 this->makePath(); 86 87 // do perspective drawPaint as the background; 88 SkPaint bkgnrd; 89 SkPoint center = SkPoint::Make(SkIntToScalar(100), 90 SkIntToScalar(100)); 91 SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN, 92 SK_ColorYELLOW, SK_ColorWHITE}; 93 SkScalar pos[] = {0, SK_ScalarHalf / 2, 94 3 * SK_ScalarHalf / 2, SK_Scalar1}; 95 bkgnrd.setShader(SkGradientShader::MakeRadial(center, 96 SkIntToScalar(1000), 97 colors, 98 pos, 99 std::size(colors), 100 SkTileMode::kClamp)); 101 canvas->save(); 102 canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 103 SkMatrix mat; 104 mat.reset(); 105 mat.setPerspY(SK_Scalar1 / 1000); 106 canvas->concat(mat); 107 canvas->drawPaint(bkgnrd); 108 canvas->restore(); 109 110 // draw the paths in perspective 111 SkMatrix persp; 112 persp.reset(); 113 persp.setPerspX(-SK_Scalar1 / 1800); 114 persp.setPerspY(SK_Scalar1 / 500); 115 canvas->concat(persp); 116 117 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 118 const SkScalar scale = SkIntToScalar(5)/4; 119 120 showFour(canvas, SK_Scalar1, false); 121 canvas->translate(SkIntToScalar(450), 0); 122 showFour(canvas, scale, false); 123 124 canvas->translate(SkIntToScalar(-450), SkIntToScalar(450)); 125 showFour(canvas, SK_Scalar1, true); 126 canvas->translate(SkIntToScalar(450), 0); 127 showFour(canvas, scale, true); 128 } 129 130 private: 131 using INHERITED = GM; 132 }; 133 134 ////////////////////////////////////////////////////////////////////////////// 135 136 DEF_GM( return new FillTypePerspGM; ) 137 138 } // namespace skiagm 139