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 */ 842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com#include "gm.h" 942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com#include "SkGradientShader.h" 1042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 1142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comnamespace skiagm { 1242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 1342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstruct GradData { 1442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com int fCount; 1542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com const SkColor* fColors; 1642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com const SkScalar* fPos; 1742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 1842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 1942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkColor gColors[] = { 2042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK 2142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 2242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos0[] = { 0, SK_Scalar1 }; 2342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; 2442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos2[] = { 2542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 2642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 2742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 288ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.orgstatic const SkScalar gPosClamp[] = {0.0f, 0.0f, 1.0f, 1.0f}; 298ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.orgstatic const SkColor gColorClamp[] = { 308ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLUE 318ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org}; 328ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org 3342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const GradData gGradData[] = { 3442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { 2, gColors, NULL }, 3542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { 2, gColors, gPos0 }, 3642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { 2, gColors, gPos1 }, 3742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { 5, gColors, NULL }, 388ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org { 5, gColors, gPos2 }, 398ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org { 4, gColorClamp, gPosClamp } 4042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 4142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 4242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, 4383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm, const SkMatrix& localMatrix) { 4442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, 4583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fCount, tm, 0, &localMatrix); 4642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com} 47f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com 4842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, 4983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm, const SkMatrix& localMatrix) { 5042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkPoint center; 5142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 5242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkScalarAve(pts[0].fY, pts[1].fY)); 5342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com return SkGradientShader::CreateRadial(center, center.fX, data.fColors, 5483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fPos, data.fCount, tm, 0, &localMatrix); 5542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com} 5642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 5742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, 5883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode, const SkMatrix& localMatrix) { 5942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkPoint center; 6042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 6142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkScalarAve(pts[0].fY, pts[1].fY)); 6242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, 6383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fPos, data.fCount, 0, &localMatrix); 6442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com} 6542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 66f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.comstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, 6783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm, const SkMatrix& localMatrix) { 68f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkPoint center0, center1; 69f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com center0.set(SkScalarAve(pts[0].fX, pts[1].fX), 70f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 71f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), 72f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); 73f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com return SkGradientShader::CreateTwoPointRadial( 74f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com center1, (pts[1].fX - pts[0].fX) / 7, 75f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com center0, (pts[1].fX - pts[0].fX) / 2, 7683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fColors, data.fPos, data.fCount, tm, 779c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 0, &localMatrix); 78f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com} 79f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com 805cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, 8183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm, const SkMatrix& localMatrix) { 825cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkPoint center0, center1; 835cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); 845cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); 855cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com center0.set(pts[0].fX + radius0, pts[0].fY + radius0); 865cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com center1.set(pts[1].fX - radius1, pts[1].fY - radius1); 87d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return SkGradientShader::CreateTwoPointConical(center1, radius1, 88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com center0, radius0, 89d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com data.fColors, data.fPos, 9083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fCount, tm, 0, &localMatrix); 915cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com} 925cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 9342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, 9483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm, const SkMatrix& localMatrix); 9542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const GradMaker gGradMakers[] = { 965cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical 9742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 9842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 9942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com/////////////////////////////////////////////////////////////////////////////// 10042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 10142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comclass GradientsGM : public GM { 10242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.compublic: 103d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com GradientsGM() { 10448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com this->setBGColor(0xFFDDDDDD); 10548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com } 106d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comprotected: 108a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 109a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 110a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 111a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 11242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkString onShortName() { 11342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com return SkString("gradients"); 11442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com } 115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1161da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(840, 815); } 117d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com virtual void onDraw(SkCanvas* canvas) { 119d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkPoint pts[2] = { 12142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { 0, 0 }, 12242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com { SkIntToScalar(100), SkIntToScalar(100) } 12342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com }; 12442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkShader::TileMode tm = SkShader::kClamp_TileMode; 12542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 12642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com SkPaint paint; 12742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com paint.setAntiAlias(true); 128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 13042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 13142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->save(); 13242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 1339c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkMatrix scale = SkMatrix::I(); 1348ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org 1358ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org if (i == 5) { // if the clamp case 1368ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org scale.setScale(0.5f, 0.5f); 1378ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org scale.postTranslate(25.f, 25.f); 1388ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org } 139d55e357a8e276d1f1cd6231d57dda339a2beb76fskia.committer@gmail.com 14083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, scale); 1419c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 14242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com paint.setShader(shader); 14342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->drawRect(r, paint); 14442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com shader->unref(); 14542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->translate(0, SkIntToScalar(120)); 14642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com } 14742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->restore(); 14842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com canvas->translate(SkIntToScalar(120), 0); 14942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com } 15042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com } 151d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 15242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comprivate: 15342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com typedef GM INHERITED; 15442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}; 15542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 1565cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// Based on the original gradient slide, but with perspective applied to the 1575cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// gradient shaders' local matrices 1585cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comclass GradientsLocalPerspectiveGM : public GM { 1595cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.compublic: 160d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com GradientsLocalPerspectiveGM() { 1615cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com this->setBGColor(0xFFDDDDDD); 1625cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1645cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprotected: 165a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 166a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 167a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 168a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 1695cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkString onShortName() { 1705cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com return SkString("gradients_local_perspective"); 1715cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1731da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(840, 815); } 174d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1755cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com virtual void onDraw(SkCanvas* canvas) { 176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1775cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkPoint pts[2] = { 1785cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com { 0, 0 }, 1795cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com { SkIntToScalar(100), SkIntToScalar(100) } 1805cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com }; 1815cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkShader::TileMode tm = SkShader::kClamp_TileMode; 1825cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 1835cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkPaint paint; 1845cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com paint.setAntiAlias(true); 185d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1865cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 1875cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 1885cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->save(); 1895cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 1905cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com // apply an increasing y perspective as we move to the right 1915cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkMatrix perspective; 1925cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com perspective.setIdentity(); 193b7961193a3ecca44cf2650d9e446ebaa10b1583dborenet@google.com perspective.setPerspY(SkScalarDiv(SkIntToScalar((unsigned) i+1), 1945cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkIntToScalar(500))); 195b7961193a3ecca44cf2650d9e446ebaa10b1583dborenet@google.com perspective.setSkewX(SkScalarDiv(SkIntToScalar((unsigned) i+1), 1965cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkIntToScalar(10))); 1978ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org 19883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, perspective); 1995cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 2005cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com paint.setShader(shader); 2015cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->drawRect(r, paint); 2025cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com shader->unref(); 2035cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->translate(0, SkIntToScalar(120)); 2045cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 2055cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->restore(); 2065cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com canvas->translate(SkIntToScalar(120), 0); 2075cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 2085cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 209d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2105cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprivate: 2115cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com typedef GM INHERITED; 2125cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com}; 2135cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 2145cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// Based on the original gradient slide, but with perspective applied to 2155cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// the view matrix 2165cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comclass GradientsViewPerspectiveGM : public GradientsGM { 2175cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprotected: 2185cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkString onShortName() { 2195cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com return SkString("gradients_view_perspective"); 2205cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 221d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2221da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(840, 500); } 223d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2245cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com virtual void onDraw(SkCanvas* canvas) { 2255cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com SkMatrix perspective; 2265cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com perspective.setIdentity(); 2275cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 2285cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com perspective.setSkewX(SkScalarDiv(SkIntToScalar(8), SkIntToScalar(25))); 229837d31a0c9351c4d65f5d703ff12db2c7cc5f6cdscroggo@google.com canvas->concat(perspective); 2305cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com INHERITED::onDraw(canvas); 2315cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com } 232d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2335cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprivate: 2345cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com typedef GradientsGM INHERITED; 2355cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com}; 2365cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 237ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com/* 238ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com Inspired by this <canvas> javascript, where we need to detect that we are not 239ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com solving a quadratic equation, but must instead solve a linear (since our X^2 240ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com coefficient is 0) 241ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com 242ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillStyle = '#f00'; 243ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillRect(0, 0, 100, 50); 244d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 245ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); 246ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0, '#f00'); 247ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0.01, '#0f0'); 248ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0.99, '#0f0'); 249ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(1, '#f00'); 250ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillStyle = g; 251ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillRect(0, 0, 100, 50); 252ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com */ 253ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comclass GradientsDegenrate2PointGM : public GM { 254ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.compublic: 255ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com GradientsDegenrate2PointGM() {} 256d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 257ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comprotected: 258ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com SkString onShortName() { 259ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com return SkString("gradients_degenerate_2pt"); 260ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com } 261d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2621da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(320, 320); } 263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 264ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com void drawBG(SkCanvas* canvas) { 265ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com canvas->drawColor(SK_ColorBLUE); 266ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com } 267d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 268ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com virtual void onDraw(SkCanvas* canvas) { 269ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com this->drawBG(canvas); 270d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 271ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorRED }; 2724b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 }; 27359f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com SkPoint c0; 27459f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com c0.iset(-80, 25); 27559f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com SkScalar r0 = SkIntToScalar(70); 27659f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com SkPoint c1; 27759f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com c1.iset(0, 25); 27859f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com SkScalar r1 = SkIntToScalar(150); 279ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors, 280ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com pos, SK_ARRAY_COUNT(pos), 281ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com SkShader::kClamp_TileMode); 282ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com SkPaint paint; 283ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com paint.setShader(s)->unref(); 284ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com canvas->drawPaint(paint); 285ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com } 286d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 287ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comprivate: 288ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com typedef GM INHERITED; 289ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com}; 290ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com 2915ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com/// Tests correctness of *optimized* codepaths in gradients. 2925ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 2935ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comclass ClampedGradientsGM : public GM { 2945ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.compublic: 2955ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com ClampedGradientsGM() {} 2965ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 2975ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comprotected: 2985ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkString onShortName() { return SkString("clamped_gradients"); } 2995ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3001da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(640, 510); } 3015ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3025ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com void drawBG(SkCanvas* canvas) { 3035ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com canvas->drawColor(0xFFDDDDDD); 3045ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com } 3055ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3065ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com virtual void onDraw(SkCanvas* canvas) { 3075ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com this->drawBG(canvas); 3085ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3095ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) }; 3105ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkPaint paint; 3115ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com paint.setAntiAlias(true); 3125ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3135ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkPoint center; 3145ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com center.iset(0, 300); 3155ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 3165ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkShader* shader = SkGradientShader::CreateRadial( 3175ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com SkPoint(center), 31801744a46e8cf0419f9e85ac148fe2bed2120e51fbungeman@google.com SkIntToScalar(200), gColors, NULL, 5, 31983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::kClamp_TileMode); 3205ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com paint.setShader(shader); 3215ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com canvas->drawRect(r, paint); 3225ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com shader->unref(); 3235ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com } 3245ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 3255ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comprivate: 3265ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com typedef GM INHERITED; 3275ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com}; 3285ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 329b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com/// Checks quality of large radial gradients, which may display 330b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com/// some banding. 331b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com 332b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comclass RadialGradientGM : public GM { 333b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.compublic: 334b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com RadialGradientGM() {} 335b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com 336b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comprotected: 337a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 338a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 339a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 340a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 341b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com SkString onShortName() { return SkString("radial_gradient"); } 3421da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(1280, 1280); } 343b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com void drawBG(SkCanvas* canvas) { 344b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com canvas->drawColor(0xFF000000); 345b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com } 346b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com virtual void onDraw(SkCanvas* canvas) { 347bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com const SkISize dim = this->getISize(); 348bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com 349b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com this->drawBG(canvas); 350d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 351b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com SkPaint paint; 352b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com paint.setDither(true); 353b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com SkPoint center; 354bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2); 355bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com SkScalar radius = SkIntToScalar(dim.width())/2; 356bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 }; 3574b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org const SkScalar pos[] = { 0.0f, 3584b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 0.35f, 3594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 1.0f }; 360b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com SkShader* shader = 361b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com SkGradientShader::CreateRadial(center, radius, colors, 362bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com pos, SK_ARRAY_COUNT(pos), 363bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com SkShader::kClamp_TileMode); 364b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com paint.setShader(shader)->unref(); 365bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com SkRect r = { 366bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com 0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height()) 367bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com }; 368b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com canvas->drawRect(r, paint); 369b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com } 370b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comprivate: 371b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com typedef GM INHERITED; 372b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com}; 373b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com 374b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com 375361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comclass RadialGradient2GM : public GM { 376361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.compublic: 377361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com RadialGradient2GM() {} 378361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 379361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comprotected: 380a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 381a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 382a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 383a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 384361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com SkString onShortName() { return SkString("radial_gradient2"); } 3851da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com virtual SkISize onISize() { return SkISize::Make(800, 400); } 386361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com void drawBG(SkCanvas* canvas) { 387361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com canvas->drawColor(0xFF000000); 388361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com } 389361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 390361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com // Reproduces the example given in bug 7671058. 391361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com virtual void onDraw(SkCanvas* canvas) { 392361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com SkPaint paint1, paint2, paint3; 393361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com paint1.setStyle(SkPaint::kFill_Style); 394361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com paint2.setStyle(SkPaint::kFill_Style); 395361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com paint3.setStyle(SkPaint::kFill_Style); 396361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 397361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com const SkColor sweep_colors[] = 398361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF, 0xFFFF0000 }; 399361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com const SkColor colors1[] = { 0xFFFFFFFF, 0x00000000 }; 400361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com const SkColor colors2[] = { 0xFF000000, 0x00000000 }; 401361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 402361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com const SkScalar cx = 200, cy = 200, radius = 150; 403361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com SkPoint center; 404361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com center.set(cx, cy); 405361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 4063ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com // We can either interpolate endpoints and premultiply each point (default, more precision), 4073ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap). 4083ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPremul_Flag }; 4093ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com 4103ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) { 4113ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkAutoTUnref<SkShader> sweep( 4123ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkGradientShader::CreateSweep(cx, cy, sweep_colors, 4133ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com NULL, SK_ARRAY_COUNT(sweep_colors), 41483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org flags[i], NULL)); 4153ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkAutoTUnref<SkShader> radial1( 4163ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkGradientShader::CreateRadial(center, radius, colors1, 4173ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com NULL, SK_ARRAY_COUNT(colors1), 4183ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkShader::kClamp_TileMode, 41983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org flags[i], NULL)); 4203ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkAutoTUnref<SkShader> radial2( 4213ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkGradientShader::CreateRadial(center, radius, colors2, 4223ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com NULL, SK_ARRAY_COUNT(colors2), 4233ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com SkShader::kClamp_TileMode, 42483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org flags[i], NULL)); 4253ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com paint1.setShader(sweep); 4263ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com paint2.setShader(radial1); 4273ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com paint3.setShader(radial2); 4283ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com 4293ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com canvas->drawCircle(cx, cy, radius, paint1); 4303ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com canvas->drawCircle(cx, cy, radius, paint3); 4313ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com canvas->drawCircle(cx, cy, radius, paint2); 4323ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com 4333ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com canvas->translate(400, 0); 4343ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com } 435361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com } 436361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 437361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comprivate: 438361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com typedef GM INHERITED; 439361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com}; 4405ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 44142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com/////////////////////////////////////////////////////////////////////////////// 44242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 44342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic GM* MyFactory(void*) { return new GradientsGM; } 44442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic GMRegistry reg(MyFactory); 44542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com 446ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comstatic GM* MyFactory2(void*) { return new GradientsDegenrate2PointGM; } 447ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comstatic GMRegistry reg2(MyFactory2); 448ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com 4495ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comstatic GM* MyFactory3(void*) { return new ClampedGradientsGM; } 4505ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comstatic GMRegistry reg3(MyFactory3); 4515ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com 452b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comstatic GM* MyFactory4(void*) { return new RadialGradientGM; } 453b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comstatic GMRegistry reg4(MyFactory4); 4545cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 4555cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GM* MyFactory5(void*) { return new GradientsLocalPerspectiveGM; } 4565cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GMRegistry reg5(MyFactory5); 4575cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com 4585cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GM* MyFactory6(void*) { return new GradientsViewPerspectiveGM; } 4595cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GMRegistry reg6(MyFactory6); 460361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com 461361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comstatic GM* MyFactory7(void*) { return new RadialGradient2GM; } 462361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comstatic GMRegistry reg7(MyFactory7); 46342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com} 464