|  | 
 | /* | 
 |  * 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 "SkView.h" | 
 | #include "SkCanvas.h" | 
 |  | 
 | static const int kILimit = 101; | 
 | static const SkScalar kLimit = SK_Scalar1 * kILimit; | 
 |  | 
 | class OvalTestView : public SampleView { | 
 | public: | 
 |     SkSize      fSize; | 
 |     SkPMColor   fInsideColor;   // signals an interior pixel that was not set | 
 |     SkPMColor   fOutsideColor;  // signals an exterior pixels that was set | 
 |     SkBitmap    fBitmap; | 
 |  | 
 | 	OvalTestView() { | 
 |         fSize.set(SK_Scalar1, SK_Scalar1); | 
 |  | 
 |         fBitmap.setConfig(SkBitmap::kARGB_8888_Config, kILimit, kILimit); | 
 |         fBitmap.allocPixels(); | 
 |  | 
 |         fInsideColor = SkPreMultiplyColor(SK_ColorRED); | 
 |         fOutsideColor = SkPreMultiplyColor(SK_ColorGREEN); | 
 |  | 
 |         this->setBGColor(0xFFDDDDDD); | 
 |     } | 
 |  | 
 | protected: | 
 |     // overrides from SkEventSink | 
 |     virtual bool onQuery(SkEvent* evt) { | 
 |         if (SampleCode::TitleQ(*evt)) { | 
 |             SampleCode::TitleR(evt, "OvalTest"); | 
 |             return true; | 
 |         } | 
 |         return this->INHERITED::onQuery(evt); | 
 |     } | 
 |  | 
 |     void drawOval() { | 
 |         SkCanvas canvas(fBitmap); | 
 |         SkPaint p; | 
 |  | 
 |         fBitmap.eraseColor(0); | 
 |         canvas.drawOval(SkRect::MakeSize(fSize), p); | 
 |     } | 
 |  | 
 |     int checkOval(int* flatCount, int* buldgeCount) { | 
 |         int flatc = 0; | 
 |         int buldgec = 0; | 
 |         const SkScalar rad = SkScalarHalf(fSize.width()); | 
 |         SkScalar cx = SkScalarHalf(fSize.width()); | 
 |         SkScalar cy = SkScalarHalf(fSize.height()); | 
 |         for (int y = 0; y < kILimit; y++) { | 
 |             for (int x = 0; x < kILimit; x++) { | 
 |                 // measure from pixel centers | 
 |                 SkScalar px = SkIntToScalar(x) + SK_ScalarHalf; | 
 |                 SkScalar py = SkIntToScalar(y) + SK_ScalarHalf; | 
 |  | 
 |                 SkPMColor* ptr = fBitmap.getAddr32(x, y); | 
 |                 SkScalar dist = SkPoint::Length(px - cx, py - cy); | 
 |                 if (dist <= rad && !*ptr) { | 
 |                     flatc++; | 
 |                     *ptr = fInsideColor; | 
 |                 } else if (dist > rad && *ptr) { | 
 |                     buldgec++; | 
 |                     *ptr = fOutsideColor; | 
 |                 } | 
 |             } | 
 |         } | 
 |         if (flatCount) *flatCount = flatc; | 
 |         if (buldgeCount) *buldgeCount = buldgec; | 
 |         return flatc + buldgec; | 
 |     } | 
 |  | 
 |     virtual void onDrawContent(SkCanvas* canvas) { | 
 |         this->drawOval(); | 
 |         int flatCount, buldgeCount; | 
 |         this->checkOval(&flatCount, &buldgeCount); | 
 |         this->inval(NULL); | 
 |  | 
 |         canvas->drawBitmap(fBitmap, SkIntToScalar(20), SkIntToScalar(20), NULL); | 
 |  | 
 |  | 
 |         static int gFlatCount; | 
 |         static int gBuldgeCount; | 
 |         gFlatCount += flatCount; | 
 |         gBuldgeCount += buldgeCount; | 
 |  | 
 |         if (fSize.fWidth < kLimit) { | 
 |             SkDebugf("--- width=%g, flat=%d buldge=%d total: flat=%d buldge=%d\n", fSize.fWidth, | 
 |                      flatCount, buldgeCount, gFlatCount, gBuldgeCount); | 
 |             fSize.fWidth += SK_Scalar1; | 
 |             fSize.fHeight += SK_Scalar1; | 
 |         } else { | 
 |          //   fSize.set(SK_Scalar1, SK_Scalar1); | 
 |         } | 
 |     } | 
 |  | 
 |     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { | 
 |         this->inval(NULL); | 
 |         return NULL; | 
 |     } | 
 |  | 
 | private: | 
 |     typedef SampleView INHERITED; | 
 | }; | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | static SkView* MyFactory() { return new OvalTestView; } | 
 | static SkViewRegister reg(MyFactory); | 
 |  |