11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SampleCode.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkView.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGraphics.h" 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkImageDecoder.h" 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPath.h" 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRegion.h" 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkShader.h" 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkUtils.h" 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkXfermode.h" 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorPriv.h" 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorFilter.h" 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkParsePath.h" 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTime.h" 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTypeface.h" 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGeometry.h" 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass ConcavePathView : public SampleView { 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ConcavePathView() {} 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // overrides from SkEventSink 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onQuery(SkEvent* evt) { 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (SampleCode::TitleQ(*evt)) { 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleCode::TitleR(evt, "ConcavePaths"); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return true; 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->INHERITED::onQuery(evt); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setStyle(SkPaint::kFill_Style); 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Concave test 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(0, 0); 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(30), SkIntToScalar(30)); 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Reverse concave test 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(100, 0); 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(30), SkIntToScalar(30)); 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Bowtie (intersection) 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(200, 0); 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // "fake" bowtie (concave, but no intersection) 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(300, 0); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(50), SkIntToScalar(40)); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(50), SkIntToScalar(60)); 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Fish test (intersection/concave) 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(0, 100); 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(70), SkIntToScalar(50)); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(0), SkIntToScalar(50)); 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Collinear test 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(100, 100); 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(50), SkIntToScalar(20)); 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(50), SkIntToScalar(80)); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Hole test 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (1) { 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(200, 100); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.moveTo(SkIntToScalar(30), SkIntToScalar(30)); 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(30), SkIntToScalar(70)); 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(70), SkIntToScalar(70)); 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.lineTo(SkIntToScalar(70), SkIntToScalar(30)); 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->inval(NULL); 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->INHERITED::onFindClickHandler(x, y); 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef SampleView INHERITED; 1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////// 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkView* MyFactory() { return new ConcavePathView; } 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkViewRegister reg(MyFactory); 1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 154