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.h" 9 #include "SkCanvas.h" 10 #include "SkPath.h" 11 12 namespace skiagm { 13 14 /** Draw a 2px border around the target, then red behind the target; 15 set the clip to match the target, then draw >> the target in blue. 16 */ 17 18 void draw (SkCanvas* canvas, SkRect& target, int x, int y) { 19 SkPaint borderPaint; 20 borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0)); 21 borderPaint.setAntiAlias(true); 22 SkPaint backgroundPaint; 23 backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0)); 24 backgroundPaint.setAntiAlias(true); 25 SkPaint foregroundPaint; 26 foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD)); 27 foregroundPaint.setAntiAlias(true); 28 29 canvas->save(); 30 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 31 target.inset(SkIntToScalar(-2), SkIntToScalar(-2)); 32 canvas->drawRect(target, borderPaint); 33 target.inset(SkIntToScalar(2), SkIntToScalar(2)); 34 canvas->drawRect(target, backgroundPaint); 35 canvas->clipRect(target, SkRegion::kIntersect_Op, true); 36 target.inset(SkIntToScalar(-4), SkIntToScalar(-4)); 37 canvas->drawRect(target, foregroundPaint); 38 canvas->restore(); 39 } 40 41 void draw_square (SkCanvas* canvas, int x, int y) { 42 SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1)); 43 draw(canvas, target, x, y); 44 } 45 46 void draw_column (SkCanvas* canvas, int x, int y) { 47 SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1)); 48 draw(canvas, target, x, y); 49 } 50 51 void draw_bar (SkCanvas* canvas, int x, int y) { 52 SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1)); 53 draw(canvas, target, x, y); 54 } 55 56 void draw_rect_tests (SkCanvas* canvas) { 57 draw_square(canvas, 10, 10); 58 draw_column(canvas, 30, 10); 59 draw_bar(canvas, 10, 30); 60 } 61 62 /** 63 Test a set of clipping problems discovered while writing blitAntiRect, 64 and test all the code paths through the clipping blitters. 65 Each region should show as a blue center surrounded by a 2px green 66 border, with no red. 67 */ 68 69 class AAClipGM : public GM { 70 public: 71 AAClipGM() { 72 73 } 74 75 protected: 76 virtual SkString onShortName() { 77 return SkString("aaclip"); 78 } 79 80 virtual SkISize onISize() { 81 return make_isize(640, 480); 82 } 83 84 virtual void onDraw(SkCanvas* canvas) { 85 // Initial pixel-boundary-aligned draw 86 draw_rect_tests(canvas); 87 88 // Repeat 4x with .2, .4, .6, .8 px offsets 89 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 90 canvas->translate(SkIntToScalar(50), 0); 91 draw_rect_tests(canvas); 92 93 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 94 canvas->translate(SkIntToScalar(50), 0); 95 draw_rect_tests(canvas); 96 97 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 98 canvas->translate(SkIntToScalar(50), 0); 99 draw_rect_tests(canvas); 100 101 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 102 canvas->translate(SkIntToScalar(50), 0); 103 draw_rect_tests(canvas); 104 } 105 106 private: 107 typedef GM INHERITED; 108 }; 109 110 ////////////////////////////////////////////////////////////////////////////// 111 112 static GM* MyFactory(void*) { return new AAClipGM; } 113 static GMRegistry reg(MyFactory); 114 115 } 116