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