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