complexclip2.cpp revision 45482d1d2b97de185df137a1db40cbe5a62313a5
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 9#include "gm.h" 10#include "SkCanvas.h" 11#include "SkPath.h" 12#include "SkRandom.h" 13 14namespace skiagm { 15 16class ComplexClip2GM : public GM { 17public: 18 ComplexClip2GM() { 19 SkScalar xA = 0 * SK_Scalar1; 20 SkScalar xB = 10 * SK_Scalar1; 21 SkScalar xC = 20 * SK_Scalar1; 22 SkScalar xD = 30 * SK_Scalar1; 23 SkScalar xE = 40 * SK_Scalar1; 24 SkScalar xF = 50 * SK_Scalar1; 25 26 SkScalar yA = 0 * SK_Scalar1; 27 SkScalar yB = 10 * SK_Scalar1; 28 SkScalar yC = 20 * SK_Scalar1; 29 SkScalar yD = 30 * SK_Scalar1; 30 SkScalar yE = 40 * SK_Scalar1; 31 SkScalar yF = 50 * SK_Scalar1; 32 33 fWidth = xF - xA; 34 fHeight = yF - yA; 35 36 fRects[0].set(xB, yB, xE, yE); 37 fRectColors[0] = SK_ColorRED; 38 39 fRects[1].set(xA, yA, xD, yD); 40 fRectColors[1] = SK_ColorGREEN; 41 42 fRects[2].set(xC, yA, xF, yD); 43 fRectColors[2] = SK_ColorBLUE; 44 45 fRects[3].set(xA, yC, xD, yF); 46 fRectColors[3] = SK_ColorYELLOW; 47 48 fRects[4].set(xC, yC, xF, yF); 49 fRectColors[4] = SK_ColorCYAN; 50 51 fTotalWidth = kCols * fWidth + SK_Scalar1 * (kCols + 1) * kPadX; 52 fTotalHeight = kRows * fHeight + SK_Scalar1 * (kRows + 1) * kPadY; 53 54 SkRegion::Op ops[] = { 55 SkRegion::kDifference_Op, 56 SkRegion::kIntersect_Op, 57 SkRegion::kUnion_Op, 58 SkRegion::kXOR_Op, 59 SkRegion::kReverseDifference_Op, 60 SkRegion::kReplace_Op, 61 }; 62 63 SkRandom r; 64 for (int i = 0; i < kRows; ++i) { 65 for (int j = 0; j < kCols; ++j) { 66 for (int k = 0; k < 5; ++k) { 67 fOps[j*kRows+i][k] = ops[r.nextU() % SK_ARRAY_COUNT(ops)]; 68 } 69 } 70 } 71 } 72 73protected: 74 75 static const int kRows = 5; 76 static const int kCols = 5; 77 static const int kPadX = 20; 78 static const int kPadY = 20; 79 80 virtual SkString onShortName() { 81 return SkString("complexclip2"); 82 } 83 84 virtual SkISize onISize() { 85 return make_isize(SkScalarRoundToInt(fTotalWidth), 86 SkScalarRoundToInt(fTotalHeight)); 87 } 88 89 void drawBG(SkCanvas* canvas) { 90 canvas->drawColor(SkColorSetRGB(0xDD,0xA0,0xDD)); 91 } 92 93 virtual void onDraw(SkCanvas* canvas) { 94 this->drawBG(canvas); 95 SkPaint rectPaint; 96 rectPaint.setStyle(SkPaint::kStroke_Style); 97 rectPaint.setStrokeWidth(-1); 98 99 SkPaint fillPaint; 100 fillPaint.setColor(SkColorSetRGB(0xA0,0xDD,0xA0)); 101 102 for (int i = 0; i < kRows; ++i) { 103 for (int j = 0; j < kCols; ++j) { 104 canvas->save(); 105 canvas->translate(kPadX * SK_Scalar1 + (fWidth + kPadX * SK_Scalar1)*j, 106 kPadY * SK_Scalar1 + (fHeight + kPadY * SK_Scalar1)*i); 107 canvas->save(); 108 for (int k = 0; k < 5; ++k) { 109 canvas->clipRect(fRects[k], fOps[j*kRows+i][k]); 110 } 111 canvas->drawRect(SkRect::MakeWH(fWidth, fHeight), fillPaint); 112 canvas->restore(); 113 for (int k = 0; k < 5; ++k) { 114 rectPaint.setColor(fRectColors[k]); 115 canvas->drawRect(fRects[k], rectPaint); 116 } 117 canvas->restore(); 118 } 119 } 120 } 121private: 122 SkRect fRects[5]; 123 SkColor fRectColors[5]; 124 SkRegion::Op fOps[kRows * kCols][5]; 125 SkScalar fWidth; 126 SkScalar fHeight; 127 SkScalar fTotalWidth; 128 SkScalar fTotalHeight; 129 130 typedef GM INHERITED; 131}; 132 133////////////////////////////////////////////////////////////////////////////// 134 135static GM* MyFactory(void*) { return new ComplexClip2GM; } 136static GMRegistry reg(MyFactory); 137 138} 139