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    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.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
50                 mask.fBounds.height(), mask.fRowBytes);
51    bm.setPixels(mask.fImage);
52
53    SkPaint paint;
54    canvas->drawBitmap(bm,
55                       SK_Scalar1 * mask.fBounds.fLeft,
56                       SK_Scalar1 * mask.fBounds.fTop,
57                       &paint);
58}
59
60class AAClipView : public SampleView {
61public:
62    AAClipView() {
63        testop();
64    }
65
66protected:
67    // overrides from SkEventSink
68    virtual bool onQuery(SkEvent* evt) {
69        if (SampleCode::TitleQ(*evt)) {
70            SampleCode::TitleR(evt, "AAClip");
71            return true;
72        }
73        return this->INHERITED::onQuery(evt);
74    }
75
76    virtual void onDrawContent(SkCanvas* canvas) {
77#if 1
78        SkAAClip aaclip;
79        SkPath path;
80        SkRect bounds;
81
82        bounds.set(0, 0, 20, 20);
83        bounds.inset(SK_ScalarHalf, SK_ScalarHalf);
84
85//        path.addRect(bounds);
86//        path.addOval(bounds);
87        path.addRoundRect(bounds, 4, 4);
88        aaclip.setPath(path);
89        canvas->translate(30, 30);
90        drawClip(canvas, aaclip);
91
92        SkAAClip aaclip2;
93        path.offset(10, 10);
94        aaclip2.setPath(path);
95        canvas->translate(30, 0);
96        drawClip(canvas, aaclip2);
97
98        SkAAClip aaclip3;
99        aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op);
100        canvas->translate(30, 0);
101        drawClip(canvas, aaclip3);
102
103#endif
104
105#if 0
106        SkRect r;
107        r.set(0, 0, this->width(), this->height());
108        r.inset(20, 20);
109        canvas->clipRect(r);
110
111        SkPath path;
112        path.addRect(r);
113        SkPaint paint;
114        paint.setAntiAlias(true);
115        paint.setColor(SK_ColorRED);
116        canvas->drawPath(path, paint);
117#endif
118    }
119
120private:
121    typedef SkView INHERITED;
122};
123
124//////////////////////////////////////////////////////////////////////////////
125
126static SkView* MyFactory() { return new AAClipView; }
127static SkViewRegister reg(MyFactory);
128
129