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/SkPath.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.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius); 35 fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius); 36 } 37 } 38 39 protected: 40 onShortName()41 SkString onShortName() override { 42 return SkString("filltypespersp"); 43 } 44 onISize()45 SkISize onISize() override { 46 return SkISize::Make(835, 840); 47 } 48 showPath(SkCanvas * canvas,int x,int y,SkPath::FillType ft,SkScalar scale,const SkPaint & paint)49 void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft, 50 SkScalar scale, const SkPaint& paint) { 51 const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) }; 52 53 canvas->save(); 54 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 55 canvas->clipRect(r); 56 canvas->drawColor(SK_ColorWHITE); 57 fPath.setFillType(ft); 58 canvas->translate(r.centerX(), r.centerY()); 59 canvas->scale(scale, scale); 60 canvas->translate(-r.centerX(), -r.centerY()); 61 canvas->drawPath(fPath, paint); 62 canvas->restore(); 63 } 64 showFour(SkCanvas * canvas,SkScalar scale,bool aa)65 void showFour(SkCanvas* canvas, SkScalar scale, bool aa) { 66 SkPaint paint; 67 SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100)); 68 SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN}; 69 SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1}; 70 paint.setShader(SkGradientShader::MakeRadial(center, 71 SkIntToScalar(100), 72 colors, 73 pos, 74 SK_ARRAY_COUNT(colors), 75 SkTileMode::kClamp)); 76 paint.setAntiAlias(aa); 77 78 showPath(canvas, 0, 0, SkPath::kWinding_FillType, 79 scale, paint); 80 showPath(canvas, 200, 0, SkPath::kEvenOdd_FillType, 81 scale, paint); 82 showPath(canvas, 00, 200, SkPath::kInverseWinding_FillType, 83 scale, paint); 84 showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType, 85 scale, paint); 86 } 87 onDraw(SkCanvas * canvas)88 void onDraw(SkCanvas* canvas) override { 89 this->makePath(); 90 91 // do perspective drawPaint as the background; 92 SkPaint bkgnrd; 93 SkPoint center = SkPoint::Make(SkIntToScalar(100), 94 SkIntToScalar(100)); 95 SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN, 96 SK_ColorYELLOW, SK_ColorWHITE}; 97 SkScalar pos[] = {0, SK_ScalarHalf / 2, 98 3 * SK_ScalarHalf / 2, SK_Scalar1}; 99 bkgnrd.setShader(SkGradientShader::MakeRadial(center, 100 SkIntToScalar(1000), 101 colors, 102 pos, 103 SK_ARRAY_COUNT(colors), 104 SkTileMode::kClamp)); 105 canvas->save(); 106 canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 107 SkMatrix mat; 108 mat.reset(); 109 mat.setPerspY(SK_Scalar1 / 1000); 110 canvas->concat(mat); 111 canvas->drawPaint(bkgnrd); 112 canvas->restore(); 113 114 // draw the paths in perspective 115 SkMatrix persp; 116 persp.reset(); 117 persp.setPerspX(-SK_Scalar1 / 1800); 118 persp.setPerspY(SK_Scalar1 / 500); 119 canvas->concat(persp); 120 121 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 122 const SkScalar scale = SkIntToScalar(5)/4; 123 124 showFour(canvas, SK_Scalar1, false); 125 canvas->translate(SkIntToScalar(450), 0); 126 showFour(canvas, scale, false); 127 128 canvas->translate(SkIntToScalar(-450), SkIntToScalar(450)); 129 showFour(canvas, SK_Scalar1, true); 130 canvas->translate(SkIntToScalar(450), 0); 131 showFour(canvas, scale, true); 132 } 133 134 private: 135 typedef GM INHERITED; 136 }; 137 138 ////////////////////////////////////////////////////////////////////////////// 139 140 DEF_GM( return new FillTypePerspGM; ) 141 142 } 143