diff options
author | tomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-21 14:27:14 +0000 |
---|---|---|
committer | tomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-21 14:27:14 +0000 |
commit | ef279d36ca176d3669b1623aa4692f469ec52a58 (patch) | |
tree | 9e7d761a39c81446251772f22bbd2ee44cf380f1 /gm/aaclip.cpp | |
parent | 020798af6780ba29156f4daec87c29ae9e4f4a12 (diff) |
New gm to test anti-aliased clipping.
git-svn-id: http://skia.googlecode.com/svn/trunk@2914 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/aaclip.cpp')
-rw-r--r-- | gm/aaclip.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/gm/aaclip.cpp b/gm/aaclip.cpp new file mode 100644 index 0000000000..f130439bdb --- /dev/null +++ b/gm/aaclip.cpp @@ -0,0 +1,115 @@ +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "SkCanvas.h" +#include "SkPath.h" + +namespace skiagm { + +/** Draw a 2px border around the target, then red behind the target; + set the clip to match the target, then draw >> the target in blue. +*/ + +void draw (SkCanvas* canvas, SkRect& target, int x, int y) { + SkPaint borderPaint; + borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0)); + borderPaint.setAntiAlias(true); + SkPaint backgroundPaint; + backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0)); + backgroundPaint.setAntiAlias(true); + SkPaint foregroundPaint; + foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD)); + foregroundPaint.setAntiAlias(true); + + canvas->save(); + canvas->translate(x, y); + target.inset(-2, -2); + canvas->drawRect(target, borderPaint); + target.inset(2, 2); + canvas->drawRect(target, backgroundPaint); + canvas->clipRect(target, SkRegion::kIntersect_Op, true); + target.inset(-4, -4); + canvas->drawRect(target, foregroundPaint); + canvas->restore(); +} + +void draw_square (SkCanvas* canvas, int x, int y) { + SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1)); + draw(canvas, target, x, y); +} + +void draw_column (SkCanvas* canvas, int x, int y) { + SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1)); + draw(canvas, target, x, y); +} + +void draw_bar (SkCanvas* canvas, int x, int y) { + SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1)); + draw(canvas, target, x, y); +} + +void draw_rect_tests (SkCanvas* canvas) { + draw_square(canvas, 10, 10); + draw_column(canvas, 30, 10); + draw_bar(canvas, 10, 30); +} + +/** + Test a set of clipping problems discovered while writing blitAntiRect, + and test all the code paths through the clipping blitters. + Each region should show as a blue center surrounded by a 2px green + border, with no red. +*/ + +class AAClipGM : public GM { +public: + AAClipGM() { + + } + +protected: + virtual SkString onShortName() { + return SkString("aaclip"); + } + + virtual SkISize onISize() { + return make_isize(640, 480); + } + + virtual void onDraw(SkCanvas* canvas) { + // Initial pixel-boundary-aligned draw + draw_rect_tests(canvas); + + // Repeat 4x with .2, .4, .6, .8 px offsets + canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); + canvas->translate(50, 0); + draw_rect_tests(canvas); + + canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); + canvas->translate(50, 0); + draw_rect_tests(canvas); + + canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); + canvas->translate(50, 0); + draw_rect_tests(canvas); + + canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); + canvas->translate(50, 0); + draw_rect_tests(canvas); + } + +private: + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory(void*) { return new AAClipGM; } +static GMRegistry reg(MyFactory); + +} |