|  |  | 
|  | /* | 
|  | * 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); |