182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com/* 282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * Copyright 2013 Google Inc. 382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * 482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * found in the LICENSE file. 682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com */ 782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "gm.h" 833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "SkGradientShader.h" 1082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comusing namespace skiagm; 1282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstruct GradData { 1482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com int fCount; 1582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com const SkColor* fColors; 1682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com const SkScalar* fPos; 1782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 1882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 19dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gColors[] = { 2082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, 2182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 2282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 23dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradData gGradData[] = { 2496fcdcc219d2a0d3579719b84b28bede76efba64halcanary { 1, gColors, nullptr }, 2596fcdcc219d2a0d3579719b84b28bede76efba64halcanary { 2, gColors, nullptr }, 2696fcdcc219d2a0d3579719b84b28bede76efba64halcanary { 3, gColors, nullptr }, 2796fcdcc219d2a0d3579719b84b28bede76efba64halcanary { 4, gColors, nullptr }, 2882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 2982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 301a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 311a9b9640843a64af8d9d90337ec3b3fea663196areed return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm); 3282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 3382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 341a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 3582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center; 3682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 3782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 381a9b9640843a64af8d9d90337ec3b3fea663196areed return SkGradientShader::MakeRadial(center, center.fX, data.fColors, data.fPos, data.fCount, tm); 3982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 4082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 411a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) { 4282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center; 4382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 4482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 451a9b9640843a64af8d9d90337ec3b3fea663196areed return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); 4682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 4782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 481a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 4982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center0, center1; 5082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center0.set(SkScalarAve(pts[0].fX, pts[1].fX), 5182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 5282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), 5382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); 541a9b9640843a64af8d9d90337ec3b3fea663196areed return SkGradientShader::MakeTwoPointConical( 5582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center1, (pts[1].fX - pts[0].fX) / 7, 5682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center0, (pts[1].fX - pts[0].fX) / 2, 5783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fColors, data.fPos, data.fCount, tm); 5882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 5982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 601a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 6182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center0, center1; 6280ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10; 6380ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3; 6482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center0.set(pts[0].fX + radius0, pts[0].fY + radius0); 6582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center1.set(pts[1].fX - radius1, pts[1].fY - radius1); 661a9b9640843a64af8d9d90337ec3b3fea663196areed return SkGradientShader::MakeTwoPointConical(center1, radius1, 6782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center0, radius0, 6882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com data.fColors, data.fPos, 6983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fCount, tm); 7082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 7182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 7282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 731a9b9640843a64af8d9d90337ec3b3fea663196areedtypedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm); 7483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org 75dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradMaker gGradMakers[] = { 7682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical, 7782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 7882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 7982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 8082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 8182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comclass GradientsNoTextureGM : public GM { 8282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.compublic: 83063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita GradientsNoTextureGM(bool dither) : fDither(dither) { 8465cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 8582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 8682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 8782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprotected: 88a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 89063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita SkString onShortName() override { 90063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita return SkString(fDither ? "gradients_no_texture" : "gradients_no_texture_nodither"); 91063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita } 92063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita 9336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { return SkISize::Make(640, 615); } 9482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 9536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 96dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr SkPoint kPts[2] = { { 0, 0 }, 9782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { SkIntToScalar(50), SkIntToScalar(50) } }; 98dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr SkShader::TileMode kTM = SkShader::kClamp_TileMode; 9982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkRect kRect = { 0, 0, SkIntToScalar(50), SkIntToScalar(50) }; 10082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPaint paint; 10182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com paint.setAntiAlias(true); 102063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita paint.setDither(fDither); 10382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 10482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 105dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr uint8_t kAlphas[] = { 0xff, 0x40 }; 10682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) { 10782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) { 10882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->save(); 10982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) { 1101a9b9640843a64af8d9d90337ec3b3fea663196areed paint.setShader(gGradMakers[j](kPts, gGradData[i], kTM)); 11182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com paint.setAlpha(kAlphas[a]); 11282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->drawRect(kRect, paint); 11382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->translate(0, SkIntToScalar(kRect.height() + 20)); 11482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 11582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->restore(); 11682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->translate(SkIntToScalar(kRect.width() + 20), 0); 11782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 11882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 11982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 12082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 12182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprivate: 122063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita bool fDither; 123063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita 12482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com typedef GM INHERITED; 12582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 12682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 12782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 12882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstruct ColorPos { 1307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkColor* fColors; 1317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar* fPos; 1327b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com int fCount; 1337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 13496fcdcc219d2a0d3579719b84b28bede76efba64halcanary ColorPos() : fColors(nullptr), fPos(nullptr), fCount(0) {} 1357b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com ~ColorPos() { 136385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary delete[] fColors; 137385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary delete[] fPos; 1387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com void construct(const SkColor colors[], const SkScalar pos[], int count) { 141385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary fColors = new SkColor[count]; 1427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com memcpy(fColors, colors, count * sizeof(SkColor)); 1437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com if (pos) { 144385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary fPos = new SkScalar[count]; 1457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com memcpy(fPos, pos, count * sizeof(SkScalar)); 1467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fPos[0] = 0; 1477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fPos[count - 1] = 1; 1487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fCount = count; 1507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}; 1527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make0(ColorPos* rec) { 1547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#if 0 1557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com From http://jsfiddle.net/3fe2a/ 1567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.combackground-image: -webkit-linear-gradient(left, #22d1cd 1%, #22d1cd 0.9510157507590116%, #df4b37 2.9510157507590113%, #df4b37 23.695886056604927%, #22d1cd 25.695886056604927%, #22d1cd 25.39321881940624%, #e6de36 27.39321881940624%, #e6de36 31.849399922570655%, #3267ff 33.849399922570655%, #3267ff 44.57735802921938%, #9d47d1 46.57735802921938%, #9d47d1 53.27185850805876%, #3267ff 55.27185850805876%, #3267ff 61.95718972227316%, #5cdd9d 63.95718972227316%, #5cdd9d 69.89166004442%, #3267ff 71.89166004442%, #3267ff 74.45795382765857%, #9d47d1 76.45795382765857%, #9d47d1 82.78364610713776%, #3267ff 84.78364610713776%, #3267ff 94.52743647737229%, #e3d082 96.52743647737229%, #e3d082 96.03934633331295%); 1587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comheight: 30px; 1597b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#endif 1607b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1617b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1627b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36, 1637b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d, 1647b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082 1657b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1667b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const double percent[] = { 1677b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927, 1687b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655, 1697b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876, 1707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442, 1717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776, 1727b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295, 1737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1747b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const int N = SK_ARRAY_COUNT(percent); 1757b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar pos[N]; 1767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i < N; ++i) { 1777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com pos[i] = SkDoubleToScalar(percent[i] / 100); 1787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com rec->construct(colors, pos, N); 1807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 1817b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1827b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make1(ColorPos* rec) { 1837b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1847b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1857b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1867b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, 1877b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 18896fcdcc219d2a0d3579719b84b28bede76efba64halcanary rec->construct(colors, nullptr, SK_ARRAY_COUNT(colors)); 1897b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 1907b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1917b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make2(ColorPos* rec) { 1927b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1937b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1947b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1957b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, 1967b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1977b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const int N = SK_ARRAY_COUNT(colors); 1987b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar pos[N]; 1997b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i < N; ++i) { 2007b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com pos[i] = SK_Scalar1 * i / (N - 1); 2017b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2027b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com rec->construct(colors, pos, N); 2037b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 2047b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2056b90df6b1c6ed843be3ac09605050605f9ec9150reedstatic void make3(ColorPos* rec) { 2066b90df6b1c6ed843be3ac09605050605f9ec9150reed const SkColor colors[] = { 2076b90df6b1c6ed843be3ac09605050605f9ec9150reed SK_ColorRED, SK_ColorBLUE, SK_ColorBLUE, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLACK, 2086b90df6b1c6ed843be3ac09605050605f9ec9150reed }; 2096b90df6b1c6ed843be3ac09605050605f9ec9150reed const SkScalar pos[] = { 2106b90df6b1c6ed843be3ac09605050605f9ec9150reed 0, 0, 0.5f, 0.5, 1, 1, 2116b90df6b1c6ed843be3ac09605050605f9ec9150reed }; 2126b90df6b1c6ed843be3ac09605050605f9ec9150reed rec->construct(colors, pos, SK_ARRAY_COUNT(colors)); 2136b90df6b1c6ed843be3ac09605050605f9ec9150reed} 2146b90df6b1c6ed843be3ac09605050605f9ec9150reed 2157b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comclass GradientsManyColorsGM : public GM { 2167b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com enum { 2177b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com W = 800, 2187b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 219cefc43112c8f6fe3702facb89447bdfcc2715345Hal Canary sk_sp<SkShader> fShader; 2207b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2217b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com typedef void (*Proc)(ColorPos*); 2227b8999b5047e059f8dbce2bb24586ac49d928731reed@google.compublic: 223063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita GradientsManyColorsGM(bool dither) : fDither(dither) {} 2248a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2257b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprotected: 226a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 227063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita SkString onShortName() override { 228063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita return SkString(fDither ? "gradients_many" : "gradients_many_nodither"); 229063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita } 230063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita 2316b90df6b1c6ed843be3ac09605050605f9ec9150reed SkISize onISize() override { return SkISize::Make(880, 400); } 2328a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 23336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 2347b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const Proc procs[] = { 2356b90df6b1c6ed843be3ac09605050605f9ec9150reed make0, make1, make2, make3, 2367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 2377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkPoint pts[] = { 2387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com { 0, 0 }, 2397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com { SkIntToScalar(W), 0 }, 2407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 2417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30); 2427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkPaint paint; 244063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita paint.setDither(fDither); 2458a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2466b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->translate(40, 20); 2478a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i <= 8; ++i) { 2497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar x = r.width() * i / 8; 2507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com canvas->drawLine(x, 0, x, 10000, paint); 2517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2536b90df6b1c6ed843be3ac09605050605f9ec9150reed // expand the drawing rect so we exercise clampping in the gradients 2546b90df6b1c6ed843be3ac09605050605f9ec9150reed const SkRect drawR = r.makeOutset(20, 0); 2557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 2567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com ColorPos rec; 2577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com procs[i](&rec); 2581a9b9640843a64af8d9d90337ec3b3fea663196areed paint.setShader(SkGradientShader::MakeLinear(pts, rec.fColors, rec.fPos, rec.fCount, 2591a9b9640843a64af8d9d90337ec3b3fea663196areed SkShader::kClamp_TileMode)); 2606b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->drawRect(drawR, paint); 2616b90df6b1c6ed843be3ac09605050605f9ec9150reed 2626b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->save(); 2636b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->translate(r.centerX(), r.height() + 4); 2646b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->scale(-1, 1); 2656b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->translate(-r.centerX(), 0); 2666b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->drawRect(drawR, paint); 2676b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->restore(); 2686b90df6b1c6ed843be3ac09605050605f9ec9150reed 2696b90df6b1c6ed843be3ac09605050605f9ec9150reed canvas->translate(0, r.height() + 2*r.height() + 8); 2707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2728a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprivate: 274063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita bool fDither; 275063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita 2767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com typedef GM INHERITED; 2777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}; 2787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com/////////////////////////////////////////////////////////////////////////////// 2807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 281063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsNoTextureGM(true);) 282063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsNoTextureGM(false);) 283063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsManyColorsGM(true);) 284063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsManyColorsGM(false);) 285