/* * 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);