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
14static 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
25static 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
36static 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
42static 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
58class AAClipView : public SampleView {
59public:
60    AAClipView() {
61        testop();
62    }
63
64protected:
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
118private:
119    typedef SkView INHERITED;
120};
121
122//////////////////////////////////////////////////////////////////////////////
123
124static SkView* MyFactory() { return new AAClipView; }
125static SkViewRegister reg(MyFactory);
126