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#include "gm.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm { 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass FillTypePerspGM : public GM { 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath fPath; 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger FillTypePerspGM() { 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkScalar radius = SkIntToScalar(45); 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius); 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius); 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkString onShortName() { 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkString("filltypespersp"); 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkISize onISize() { 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return make_isize(835, 840); 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft, 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar scale, const SkPaint& paint) { 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) }; 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->clipRect(r); 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawColor(SK_ColorWHITE); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fPath.setFillType(ft); 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(r.centerX(), r.centerY()); 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->scale(scale, scale); 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(-r.centerX(), -r.centerY()); 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(fPath, paint); 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void showFour(SkCanvas* canvas, SkScalar scale, bool aa) { 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100)); 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN}; 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1}; 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* s = SkGradientShader::CreateRadial(center, 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkIntToScalar(100), 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors, 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pos, 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ARRAY_COUNT(colors), 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode); 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setShader(s)->unref(); 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(aa); 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showPath(canvas, 0, 0, SkPath::kWinding_FillType, 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger scale, paint); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showPath(canvas, 200, 0, SkPath::kEvenOdd_FillType, 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger scale, paint); 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showPath(canvas, 00, 200, SkPath::kInverseWinding_FillType, 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger scale, paint); 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType, 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger scale, paint); 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // do perspective drawPaint as the background; 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint bkgnrd; 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint center = SkPoint::Make(SkIntToScalar(100), 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkIntToScalar(100)); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN, 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ColorYELLOW, SK_ColorWHITE}; 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar pos[] = {0, SK_ScalarHalf / 2, 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3 * SK_ScalarHalf / 2, SK_Scalar1}; 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* s = SkGradientShader::CreateRadial(center, 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkIntToScalar(1000), 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors, 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pos, 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SK_ARRAY_COUNT(colors), 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode); 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bkgnrd.setShader(s)->unref(); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkMatrix mat; 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger mat.reset(); 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000)); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->concat(mat); 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPaint(bkgnrd); 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // draw the paths in perspective 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkMatrix persp; 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger persp.reset(); 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800)); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500)); 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->concat(persp); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkScalar scale = SkIntToScalar(5)/4; 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showFour(canvas, SK_Scalar1, false); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(450), 0); 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showFour(canvas, scale, false); 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(-450), SkIntToScalar(450)); 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showFour(canvas, SK_Scalar1, true); 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(SkIntToScalar(450), 0); 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger showFour(canvas, scale, true); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef GM INHERITED; 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////// 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new FillTypePerspGM; } 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory); 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 129