1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "gm.h" 9 #include "SkGradientShader.h" 10 11 namespace skiagm { 12 13 class FillTypePerspGM : public GM { 14 SkPath fPath; 15 public: 16 FillTypePerspGM() { 17 const SkScalar radius = SkIntToScalar(45); 18 fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius); 19 fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius); 20 } 21 22 protected: 23 virtual SkString onShortName() { 24 return SkString("filltypespersp"); 25 } 26 27 virtual SkISize onISize() { 28 return make_isize(835, 840); 29 } 30 31 void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft, 32 SkScalar scale, const SkPaint& paint) { 33 34 const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) }; 35 36 canvas->save(); 37 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 38 canvas->clipRect(r); 39 canvas->drawColor(SK_ColorWHITE); 40 fPath.setFillType(ft); 41 canvas->translate(r.centerX(), r.centerY()); 42 canvas->scale(scale, scale); 43 canvas->translate(-r.centerX(), -r.centerY()); 44 canvas->drawPath(fPath, paint); 45 canvas->restore(); 46 } 47 48 void showFour(SkCanvas* canvas, SkScalar scale, bool aa) { 49 50 SkPaint paint; 51 SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100)); 52 SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN}; 53 SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1}; 54 SkShader* s = SkGradientShader::CreateRadial(center, 55 SkIntToScalar(100), 56 colors, 57 pos, 58 SK_ARRAY_COUNT(colors), 59 SkShader::kClamp_TileMode); 60 paint.setShader(s)->unref(); 61 paint.setAntiAlias(aa); 62 63 showPath(canvas, 0, 0, SkPath::kWinding_FillType, 64 scale, paint); 65 showPath(canvas, 200, 0, SkPath::kEvenOdd_FillType, 66 scale, paint); 67 showPath(canvas, 00, 200, SkPath::kInverseWinding_FillType, 68 scale, paint); 69 showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType, 70 scale, paint); 71 } 72 73 virtual void onDraw(SkCanvas* canvas) { 74 // do perspective drawPaint as the background; 75 SkPaint bkgnrd; 76 SkPoint center = SkPoint::Make(SkIntToScalar(100), 77 SkIntToScalar(100)); 78 SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN, 79 SK_ColorYELLOW, SK_ColorWHITE}; 80 SkScalar pos[] = {0, SK_ScalarHalf / 2, 81 3 * SK_ScalarHalf / 2, SK_Scalar1}; 82 SkShader* s = SkGradientShader::CreateRadial(center, 83 SkIntToScalar(1000), 84 colors, 85 pos, 86 SK_ARRAY_COUNT(colors), 87 SkShader::kClamp_TileMode); 88 bkgnrd.setShader(s)->unref(); 89 canvas->save(); 90 canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 91 SkMatrix mat; 92 mat.reset(); 93 mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000)); 94 canvas->concat(mat); 95 canvas->drawPaint(bkgnrd); 96 canvas->restore(); 97 98 // draw the paths in perspective 99 SkMatrix persp; 100 persp.reset(); 101 persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800)); 102 persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500)); 103 canvas->concat(persp); 104 105 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 106 const SkScalar scale = SkIntToScalar(5)/4; 107 108 showFour(canvas, SK_Scalar1, false); 109 canvas->translate(SkIntToScalar(450), 0); 110 showFour(canvas, scale, false); 111 112 canvas->translate(SkIntToScalar(-450), SkIntToScalar(450)); 113 showFour(canvas, SK_Scalar1, true); 114 canvas->translate(SkIntToScalar(450), 0); 115 showFour(canvas, scale, true); 116 } 117 118 private: 119 typedef GM INHERITED; 120 }; 121 122 ////////////////////////////////////////////////////////////////////////////// 123 124 static GM* MyFactory(void*) { return new FillTypePerspGM; } 125 static GMRegistry reg(MyFactory); 126 127 } 128 129