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" 882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "SkGradientShader.h" 982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comusing namespace skiagm; 1182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstruct GradData { 1382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com int fCount; 1482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com const SkColor* fColors; 1582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com const SkScalar* fPos; 1682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 1782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const SkColor gColors[] = { 1982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, 2082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 2182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 2282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const GradData gGradData[] = { 2382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { 1, gColors, NULL }, 2482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { 2, gColors, NULL }, 2582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { 3, gColors, NULL }, 2682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { 4, gColors, NULL }, 2782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 2882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 2983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 3083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm); 3182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 3282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 3383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 3482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center; 3582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 3682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 3782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com return SkGradientShader::CreateRadial(center, center.fX, data.fColors, 3883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fPos, data.fCount, tm); 3982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 4082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 4183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic 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)); 4583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); 4682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com} 4782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 4883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic 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)); 5482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com return SkGradientShader::CreateTwoPointRadial( 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 6083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 6182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkPoint center0, center1; 6282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); 6382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkScalar radius1 = SkScalarDiv(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); 6682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com return SkGradientShader::CreateTwoPointConical(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 7383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm); 7483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org 7582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const 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: 8382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com GradientsNoTextureGM() { 8482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com this->setBGColor(0xFFDDDDDD); 8582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com } 8682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 8782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprotected: 88a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 89a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 90a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 91a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 9282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com SkString onShortName() SK_OVERRIDE { return SkString("gradients_no_texture"); } 93f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 615); } 9482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 9582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 9682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com static const SkPoint kPts[2] = { { 0, 0 }, 9782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com { SkIntToScalar(50), SkIntToScalar(50) } }; 9882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com static const 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); 10282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 10382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 10482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com static const uint8_t kAlphas[] = { 0xff, 0x40 }; 10582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) { 10682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) { 10782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com canvas->save(); 10882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) { 10983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader* shader = gGradMakers[j](kPts, gGradData[i], kTM); 11082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com paint.setShader(shader)->unref(); 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: 12282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com typedef GM INHERITED; 12382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}; 12482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 12582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 12682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com 1277b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstruct ColorPos { 1287b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkColor* fColors; 1297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar* fPos; 1307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com int fCount; 1317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1327b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com ColorPos() : fColors(NULL), fPos(NULL), fCount(0) {} 1337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com ~ColorPos() { 134c25cec5f9aa4e8801ae87854adc629c742b9de59bsalomon@google.com SkDELETE_ARRAY(fColors); 135c25cec5f9aa4e8801ae87854adc629c742b9de59bsalomon@google.com SkDELETE_ARRAY(fPos); 1367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com void construct(const SkColor colors[], const SkScalar pos[], int count) { 1397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fColors = SkNEW_ARRAY(SkColor, count); 1407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com memcpy(fColors, colors, count * sizeof(SkColor)); 1417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com if (pos) { 1427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fPos = SkNEW_ARRAY(SkScalar, count); 1437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com memcpy(fPos, pos, count * sizeof(SkScalar)); 1447b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fPos[0] = 0; 1457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fPos[count - 1] = 1; 1467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com fCount = count; 1487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}; 1507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make0(ColorPos* rec) { 1527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#if 0 1537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com From http://jsfiddle.net/3fe2a/ 1547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1557b8999b5047e059f8dbce2bb24586ac49d928731reed@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%); 1567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comheight: 30px; 1577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#endif 1587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1597b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1607b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36, 1617b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d, 1627b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082 1637b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1647b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const double percent[] = { 1657b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927, 1667b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655, 1677b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876, 1687b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442, 1697b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776, 1707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295, 1717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1727b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const int N = SK_ARRAY_COUNT(percent); 1737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar pos[N]; 1747b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i < N; ++i) { 1757b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com pos[i] = SkDoubleToScalar(percent[i] / 100); 1767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 1777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com rec->construct(colors, pos, N); 1787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 1797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make1(ColorPos* rec) { 1817b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1827b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1837b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1847b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, 1857b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1867b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com rec->construct(colors, NULL, SK_ARRAY_COUNT(colors)); 1877b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 1887b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 1897b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make2(ColorPos* rec) { 1907b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkColor colors[] = { 1917b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1927b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1937b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SK_ColorBLACK, 1947b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 1957b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const int N = SK_ARRAY_COUNT(colors); 1967b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar pos[N]; 1977b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i < N; ++i) { 1987b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com pos[i] = SK_Scalar1 * i / (N - 1); 1997b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2007b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com rec->construct(colors, pos, N); 2017b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com} 2027b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2037b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comclass GradientsManyColorsGM : public GM { 2047b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com enum { 2057b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com W = 800, 2067b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 2077b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkAutoTUnref<SkShader> fShader; 2087b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2097b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com typedef void (*Proc)(ColorPos*); 2107b8999b5047e059f8dbce2bb24586ac49d928731reed@google.compublic: 2117b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com GradientsManyColorsGM() {} 2128a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2137b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprotected: 214a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 215a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 216a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 217a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 2187b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkString onShortName() SK_OVERRIDE { return SkString("gradients_many"); } 2197b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(850, 100); } 2208a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2217b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 2227b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const Proc procs[] = { 2237b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com make0, make1, make2, 2247b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 2257b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkPoint pts[] = { 2267b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com { 0, 0 }, 2277b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com { SkIntToScalar(W), 0 }, 2287b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com }; 2297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30); 2307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkPaint paint; 2328a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com canvas->translate(20, 20); 2348a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2357b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (int i = 0; i <= 8; ++i) { 2367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkScalar x = r.width() * i / 8; 2377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com canvas->drawLine(x, 0, x, 10000, paint); 2387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 2417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com ColorPos rec; 2427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com procs[i](&rec); 2437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkShader* s = SkGradientShader::CreateLinear(pts, rec.fColors, rec.fPos, rec.fCount, 2447b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com SkShader::kClamp_TileMode); 2457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com paint.setShader(s)->unref(); 2467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com canvas->drawRect(r, paint); 2477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com canvas->translate(0, r.height() + 20); 2487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com } 2508a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com 2517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprivate: 2527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com typedef GM INHERITED; 2537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}; 2547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 2557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com/////////////////////////////////////////////////////////////////////////////// 2567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com 25782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comDEF_GM( return SkNEW(GradientsNoTextureGM)); 2587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comDEF_GM( return SkNEW(GradientsManyColorsGM)); 259