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 12namespace 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 18void 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 41void 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 46void 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 51void 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 56void 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 69class AAClipGM : public GM { 70public: 71 AAClipGM() { 72 73 } 74 75protected: 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 106private: 107 typedef GM INHERITED; 108}; 109 110////////////////////////////////////////////////////////////////////////////// 111 112static GM* MyFactory(void*) { return new AAClipGM; } 113static GMRegistry reg(MyFactory); 114 115} 116