1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
81d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com#include "SampleCode.h"
91d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com#include "SkView.h"
101d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com#include "SkCanvas.h"
111d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
121d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comstatic const int kILimit = 101;
131d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comstatic const SkScalar kLimit = SK_Scalar1 * kILimit;
141d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
1581e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.comclass OvalTestView : public SampleView {
161d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.compublic:
171d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    SkSize      fSize;
181d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    SkPMColor   fInsideColor;   // signals an interior pixel that was not set
191d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    SkPMColor   fOutsideColor;  // signals an exterior pixels that was set
201d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    SkBitmap    fBitmap;
211d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
22ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    OvalTestView() {
231d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        fSize.set(SK_Scalar1, SK_Scalar1);
241d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
25a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        fBitmap.allocN32Pixels(kILimit, kILimit);
261d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
271d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        fInsideColor = SkPreMultiplyColor(SK_ColorRED);
281d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        fOutsideColor = SkPreMultiplyColor(SK_ColorGREEN);
2981e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com
3081e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com        this->setBGColor(0xFFDDDDDD);
311d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
321d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
331d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comprotected:
341d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    // overrides from SkEventSink
351d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    virtual bool onQuery(SkEvent* evt) {
361d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        if (SampleCode::TitleQ(*evt)) {
371d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            SampleCode::TitleR(evt, "OvalTest");
381d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            return true;
391d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        }
401d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        return this->INHERITED::onQuery(evt);
411d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
421d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
431d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    void drawOval() {
441d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        SkCanvas canvas(fBitmap);
451d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        SkPaint p;
461d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
47dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com        fBitmap.eraseColor(SK_ColorTRANSPARENT);
481d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        canvas.drawOval(SkRect::MakeSize(fSize), p);
491d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
501d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
511d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    int checkOval(int* flatCount, int* buldgeCount) {
521d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        int flatc = 0;
531d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        int buldgec = 0;
541d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        const SkScalar rad = SkScalarHalf(fSize.width());
551d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        SkScalar cx = SkScalarHalf(fSize.width());
561d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        SkScalar cy = SkScalarHalf(fSize.height());
571d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        for (int y = 0; y < kILimit; y++) {
581d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            for (int x = 0; x < kILimit; x++) {
591d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                // measure from pixel centers
601d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                SkScalar px = SkIntToScalar(x) + SK_ScalarHalf;
611d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                SkScalar py = SkIntToScalar(y) + SK_ScalarHalf;
621d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
631d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                SkPMColor* ptr = fBitmap.getAddr32(x, y);
641d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                SkScalar dist = SkPoint::Length(px - cx, py - cy);
651d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                if (dist <= rad && !*ptr) {
661d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                    flatc++;
671d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                    *ptr = fInsideColor;
681d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                } else if (dist > rad && *ptr) {
691d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                    buldgec++;
701d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                    *ptr = fOutsideColor;
711d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                }
721d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            }
731d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        }
741d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        if (flatCount) *flatCount = flatc;
751d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        if (buldgeCount) *buldgeCount = buldgec;
761d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        return flatc + buldgec;
771d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
781d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
7981e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
801d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        this->drawOval();
811d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        int flatCount, buldgeCount;
821d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        this->checkOval(&flatCount, &buldgeCount);
831d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        this->inval(NULL);
841d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
851d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        canvas->drawBitmap(fBitmap, SkIntToScalar(20), SkIntToScalar(20), NULL);
861d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
871d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
881d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        static int gFlatCount;
891d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        static int gBuldgeCount;
901d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        gFlatCount += flatCount;
911d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        gBuldgeCount += buldgeCount;
921d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
931d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        if (fSize.fWidth < kLimit) {
941d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            SkDebugf("--- width=%g, flat=%d buldge=%d total: flat=%d buldge=%d\n", fSize.fWidth,
951d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com                     flatCount, buldgeCount, gFlatCount, gBuldgeCount);
961d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            fSize.fWidth += SK_Scalar1;
971d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com            fSize.fHeight += SK_Scalar1;
981d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        } else {
991d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com         //   fSize.set(SK_Scalar1, SK_Scalar1);
1001d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        }
1011d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
1021d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
1039c55f801a35b0d6c39f007fae432bd13094f3c52sugoi@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_OVERRIDE {
1041d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        this->inval(NULL);
1051d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com        return NULL;
1061d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com    }
1071d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
1081d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comprivate:
10981e3d7f7943d5c257a07580b75218a5e256b0aadreed@google.com    typedef SampleView INHERITED;
1101d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com};
1111d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
1121d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com///////////////////////////////////////////////////////////////////////////////
1131d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.com
1141d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comstatic SkView* MyFactory() { return new OvalTestView; }
1151d12b1fd66e5be27fb4769ee09ce4fcd6bcc5979reed@google.comstatic SkViewRegister reg(MyFactory);
116