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