| /* | |
| * 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 "SampleCode.h" | |
| #include "SkAAClip.h" | |
| #include "SkCanvas.h" | |
| #include "SkPath.h" | |
| #include "SkView.h" | |
| static void testop(const SkIRect& r0, const SkIRect& r1, SkRegion::Op op, | |
| const SkIRect& expectedR) { | |
| SkAAClip c0, c1, c2; | |
| c0.setRect(r0); | |
| c1.setRect(r1); | |
| c2.op(c0, c1, op); | |
| SkDEBUGCODE(SkIRect r2 = c2.getBounds()); | |
| SkASSERT(r2 == expectedR); | |
| } | |
| static const struct { | |
| SkIRect r0; | |
| SkIRect r1; | |
| SkRegion::Op op; | |
| SkIRect expectedR; | |
| } gRec[] = { | |
| {{ 1, 2, 9, 3 }, { -3, 2, 5, 11 }, SkRegion::kDifference_Op, { 5, 2, 9, 3 }}, | |
| {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kDifference_Op, { 1, 11, 5, 13 }}, | |
| {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kReverseDifference_Op, { 1, 2, 5, 10 }}, | |
| }; | |
| static void testop() { | |
| for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | |
| testop(gRec[i].r0, gRec[i].r1, gRec[i].op, gRec[i].expectedR); | |
| } | |
| } | |
| static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { | |
| SkMask mask; | |
| SkBitmap bm; | |
| clip.copyToMask(&mask); | |
| SkAutoMaskFreeImage amfi(mask.fImage); | |
| bm.installMaskPixels(mask); | |
| SkPaint paint; | |
| canvas->drawBitmap(bm, | |
| SK_Scalar1 * mask.fBounds.fLeft, | |
| SK_Scalar1 * mask.fBounds.fTop, | |
| &paint); | |
| } | |
| class AAClipView : public SampleView { | |
| public: | |
| AAClipView() { | |
| testop(); | |
| } | |
| protected: | |
| // overrides from SkEventSink | |
| virtual bool onQuery(SkEvent* evt) { | |
| if (SampleCode::TitleQ(*evt)) { | |
| SampleCode::TitleR(evt, "AAClip"); | |
| return true; | |
| } | |
| return this->INHERITED::onQuery(evt); | |
| } | |
| virtual void onDrawContent(SkCanvas* canvas) { | |
| #if 1 | |
| SkAAClip aaclip; | |
| SkPath path; | |
| SkRect bounds; | |
| bounds.set(0, 0, 20, 20); | |
| bounds.inset(SK_ScalarHalf, SK_ScalarHalf); | |
| // path.addRect(bounds); | |
| // path.addOval(bounds); | |
| path.addRoundRect(bounds, 4, 4); | |
| aaclip.setPath(path); | |
| canvas->translate(30, 30); | |
| drawClip(canvas, aaclip); | |
| SkAAClip aaclip2; | |
| path.offset(10, 10); | |
| aaclip2.setPath(path); | |
| canvas->translate(30, 0); | |
| drawClip(canvas, aaclip2); | |
| SkAAClip aaclip3; | |
| aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op); | |
| canvas->translate(30, 0); | |
| drawClip(canvas, aaclip3); | |
| #endif | |
| #if 0 | |
| SkRect r; | |
| r.set(0, 0, this->width(), this->height()); | |
| r.inset(20, 20); | |
| canvas->clipRect(r); | |
| SkPath path; | |
| path.addRect(r); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setColor(SK_ColorRED); | |
| canvas->drawPath(path, paint); | |
| #endif | |
| } | |
| private: | |
| typedef SkView INHERITED; | |
| }; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| static SkView* MyFactory() { return new AAClipView; } | |
| static SkViewRegister reg(MyFactory); |