Home | History | Annotate | Download | only in samplecode
      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