1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "SampleCode.h" 10 #include "SkView.h" 11 #include "SkCanvas.h" 12 #include "SkAAClip.h" 13 14 static void testop(const SkIRect& r0, const SkIRect& r1, SkRegion::Op op, 15 const SkIRect& expectedR) { 16 SkAAClip c0, c1, c2; 17 c0.setRect(r0); 18 c1.setRect(r1); 19 c2.op(c0, c1, op); 20 21 SkDEBUGCODE(SkIRect r2 = c2.getBounds()); 22 SkASSERT(r2 == expectedR); 23 } 24 25 static const struct { 26 SkIRect r0; 27 SkIRect r1; 28 SkRegion::Op op; 29 SkIRect expectedR; 30 } gRec[] = { 31 {{ 1, 2, 9, 3 }, { -3, 2, 5, 11 }, SkRegion::kDifference_Op, { 5, 2, 9, 3 }}, 32 {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kDifference_Op, { 1, 11, 5, 13 }}, 33 {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kReverseDifference_Op, { 1, 2, 5, 10 }}, 34 }; 35 36 static void testop() { 37 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 38 testop(gRec[i].r0, gRec[i].r1, gRec[i].op, gRec[i].expectedR); 39 } 40 } 41 42 static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { 43 SkMask mask; 44 SkBitmap bm; 45 46 clip.copyToMask(&mask); 47 SkAutoMaskFreeImage amfi(mask.fImage); 48 49 bm.installMaskPixels(mask); 50 51 SkPaint paint; 52 canvas->drawBitmap(bm, 53 SK_Scalar1 * mask.fBounds.fLeft, 54 SK_Scalar1 * mask.fBounds.fTop, 55 &paint); 56 } 57 58 class AAClipView : public SampleView { 59 public: 60 AAClipView() { 61 testop(); 62 } 63 64 protected: 65 // overrides from SkEventSink 66 virtual bool onQuery(SkEvent* evt) { 67 if (SampleCode::TitleQ(*evt)) { 68 SampleCode::TitleR(evt, "AAClip"); 69 return true; 70 } 71 return this->INHERITED::onQuery(evt); 72 } 73 74 virtual void onDrawContent(SkCanvas* canvas) { 75 #if 1 76 SkAAClip aaclip; 77 SkPath path; 78 SkRect bounds; 79 80 bounds.set(0, 0, 20, 20); 81 bounds.inset(SK_ScalarHalf, SK_ScalarHalf); 82 83 // path.addRect(bounds); 84 // path.addOval(bounds); 85 path.addRoundRect(bounds, 4, 4); 86 aaclip.setPath(path); 87 canvas->translate(30, 30); 88 drawClip(canvas, aaclip); 89 90 SkAAClip aaclip2; 91 path.offset(10, 10); 92 aaclip2.setPath(path); 93 canvas->translate(30, 0); 94 drawClip(canvas, aaclip2); 95 96 SkAAClip aaclip3; 97 aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op); 98 canvas->translate(30, 0); 99 drawClip(canvas, aaclip3); 100 101 #endif 102 103 #if 0 104 SkRect r; 105 r.set(0, 0, this->width(), this->height()); 106 r.inset(20, 20); 107 canvas->clipRect(r); 108 109 SkPath path; 110 path.addRect(r); 111 SkPaint paint; 112 paint.setAntiAlias(true); 113 paint.setColor(SK_ColorRED); 114 canvas->drawPath(path, paint); 115 #endif 116 } 117 118 private: 119 typedef SkView INHERITED; 120 }; 121 122 ////////////////////////////////////////////////////////////////////////////// 123 124 static SkView* MyFactory() { return new AAClipView; } 125 static SkViewRegister reg(MyFactory); 126