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#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11
12static const int kILimit = 101;
13static const SkScalar kLimit = SK_Scalar1 * kILimit;
14
15class OvalTestView : public SampleView {
16public:
17    SkSize      fSize;
18    SkPMColor   fInsideColor;   // signals an interior pixel that was not set
19    SkPMColor   fOutsideColor;  // signals an exterior pixels that was set
20    SkBitmap    fBitmap;
21
22	OvalTestView() {
23        fSize.set(SK_Scalar1, SK_Scalar1);
24
25        fBitmap.setConfig(SkBitmap::kARGB_8888_Config, kILimit, kILimit);
26        fBitmap.allocPixels();
27
28        fInsideColor = SkPreMultiplyColor(SK_ColorRED);
29        fOutsideColor = SkPreMultiplyColor(SK_ColorGREEN);
30
31        this->setBGColor(0xFFDDDDDD);
32    }
33
34protected:
35    // overrides from SkEventSink
36    virtual bool onQuery(SkEvent* evt) {
37        if (SampleCode::TitleQ(*evt)) {
38            SampleCode::TitleR(evt, "OvalTest");
39            return true;
40        }
41        return this->INHERITED::onQuery(evt);
42    }
43
44    void drawOval() {
45        SkCanvas canvas(fBitmap);
46        SkPaint p;
47
48        fBitmap.eraseColor(0);
49        canvas.drawOval(SkRect::MakeSize(fSize), p);
50    }
51
52    int checkOval(int* flatCount, int* buldgeCount) {
53        int flatc = 0;
54        int buldgec = 0;
55        const SkScalar rad = SkScalarHalf(fSize.width());
56        SkScalar cx = SkScalarHalf(fSize.width());
57        SkScalar cy = SkScalarHalf(fSize.height());
58        for (int y = 0; y < kILimit; y++) {
59            for (int x = 0; x < kILimit; x++) {
60                // measure from pixel centers
61                SkScalar px = SkIntToScalar(x) + SK_ScalarHalf;
62                SkScalar py = SkIntToScalar(y) + SK_ScalarHalf;
63
64                SkPMColor* ptr = fBitmap.getAddr32(x, y);
65                SkScalar dist = SkPoint::Length(px - cx, py - cy);
66                if (dist <= rad && !*ptr) {
67                    flatc++;
68                    *ptr = fInsideColor;
69                } else if (dist > rad && *ptr) {
70                    buldgec++;
71                    *ptr = fOutsideColor;
72                }
73            }
74        }
75        if (flatCount) *flatCount = flatc;
76        if (buldgeCount) *buldgeCount = buldgec;
77        return flatc + buldgec;
78    }
79
80    virtual void onDrawContent(SkCanvas* canvas) {
81        this->drawOval();
82        int flatCount, buldgeCount;
83        this->checkOval(&flatCount, &buldgeCount);
84        this->inval(NULL);
85
86        canvas->drawBitmap(fBitmap, SkIntToScalar(20), SkIntToScalar(20), NULL);
87
88
89        static int gFlatCount;
90        static int gBuldgeCount;
91        gFlatCount += flatCount;
92        gBuldgeCount += buldgeCount;
93
94        if (fSize.fWidth < kLimit) {
95            SkDebugf("--- width=%g, flat=%d buldge=%d total: flat=%d buldge=%d\n", fSize.fWidth,
96                     flatCount, buldgeCount, gFlatCount, gBuldgeCount);
97            fSize.fWidth += SK_Scalar1;
98            fSize.fHeight += SK_Scalar1;
99        } else {
100         //   fSize.set(SK_Scalar1, SK_Scalar1);
101        }
102    }
103
104    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
105        this->inval(NULL);
106        return NULL;
107    }
108
109private:
110    typedef SampleView INHERITED;
111};
112
113///////////////////////////////////////////////////////////////////////////////
114
115static SkView* MyFactory() { return new OvalTestView; }
116static SkViewRegister reg(MyFactory);
117
118