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