18c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 28c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com/* 38c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * Copyright 2011 Google Inc. 48c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * 58c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 68c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * found in the LICENSE file. 78c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com */ 88c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com#include "gm.h" 9cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com#include "SkGradientShader.h" 108c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 118c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comnamespace skiagm { 128c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 138c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comclass FillTypePerspGM : public GM { 148c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkPath fPath; 158c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.compublic: 16d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com FillTypePerspGM() {} 17d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 18d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com void makePath() { 19d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com if (fPath.isEmpty()) { 20d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com const SkScalar radius = SkIntToScalar(45); 21d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius); 22d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius); 23d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com } 248c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 25d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 268c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comprotected: 27a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 318c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com virtual SkString onShortName() { 328c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com return SkString("filltypespersp"); 338c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 348c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 358c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com virtual SkISize onISize() { 36f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(835, 840); 378c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 388c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 398c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft, 408c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkScalar scale, const SkPaint& paint) { 418c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 428c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) }; 438c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 448c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->save(); 458c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 468c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->clipRect(r); 478c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->drawColor(SK_ColorWHITE); 488c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com fPath.setFillType(ft); 498c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(r.centerX(), r.centerY()); 508c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->scale(scale, scale); 518c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(-r.centerX(), -r.centerY()); 528c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->drawPath(fPath, paint); 538c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->restore(); 548c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 558c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 568c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com void showFour(SkCanvas* canvas, SkScalar scale, bool aa) { 578c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 588c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkPaint paint; 598c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100)); 608c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN}; 618c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1}; 628c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkShader* s = SkGradientShader::CreateRadial(center, 638c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkIntToScalar(100), 648c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com colors, 658c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com pos, 668c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SK_ARRAY_COUNT(colors), 678c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkShader::kClamp_TileMode); 688c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com paint.setShader(s)->unref(); 698c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com paint.setAntiAlias(aa); 708c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 718c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showPath(canvas, 0, 0, SkPath::kWinding_FillType, 728c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com scale, paint); 738c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showPath(canvas, 200, 0, SkPath::kEvenOdd_FillType, 748c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com scale, paint); 758c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showPath(canvas, 00, 200, SkPath::kInverseWinding_FillType, 768c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com scale, paint); 778c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType, 788c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com scale, paint); 798c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 808c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 818c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com virtual void onDraw(SkCanvas* canvas) { 82d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com this->makePath(); 83d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com 848c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com // do perspective drawPaint as the background; 858c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkPaint bkgnrd; 86cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com SkPoint center = SkPoint::Make(SkIntToScalar(100), 87cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com SkIntToScalar(100)); 88cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN, 89cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com SK_ColorYELLOW, SK_ColorWHITE}; 90cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com SkScalar pos[] = {0, SK_ScalarHalf / 2, 91cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com 3 * SK_ScalarHalf / 2, SK_Scalar1}; 928c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkShader* s = SkGradientShader::CreateRadial(center, 938c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkIntToScalar(1000), 948c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com colors, 958c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com pos, 968c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SK_ARRAY_COUNT(colors), 978c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkShader::kClamp_TileMode); 988c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com bkgnrd.setShader(s)->unref(); 998c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->save(); 1008c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(100), SkIntToScalar(100)); 1018c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkMatrix mat; 1028c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com mat.reset(); 10307faed110275048c83a55ae39042da2c9d916108bungeman@google.com mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000)); 1048c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->concat(mat); 1058c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->drawPaint(bkgnrd); 1068c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->restore(); 1078c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1088c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com // draw the paths in perspective 1098c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com SkMatrix persp; 1108c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com persp.reset(); 11107faed110275048c83a55ae39042da2c9d916108bungeman@google.com persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800)); 11207faed110275048c83a55ae39042da2c9d916108bungeman@google.com persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500)); 1138c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->concat(persp); 1148c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1158c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 1168c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com const SkScalar scale = SkIntToScalar(5)/4; 1178c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1188c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showFour(canvas, SK_Scalar1, false); 1198c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(450), 0); 120cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com showFour(canvas, scale, false); 1218c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1228c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(-450), SkIntToScalar(450)); 1238c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com showFour(canvas, SK_Scalar1, true); 1248c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com canvas->translate(SkIntToScalar(450), 0); 125cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com showFour(canvas, scale, true); 1268c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com } 127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1288c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comprivate: 1298c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com typedef GM INHERITED; 1308c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com}; 1318c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1328c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 1338c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 134cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.comstatic GM* MyFactory(void*) { return new FillTypePerspGM; } 1358c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comstatic GMRegistry reg(MyFactory); 1368c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com 1378c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com} 138