gradients_no_texture.cpp revision f539318f0d3dba743ec1886d5d9df0fb1be628a1
1d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek/* 2d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * Copyright 2013 Google Inc. 3d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * 4d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * Use of this source code is governed by a BSD-style license that can be 5d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * found in the LICENSE file. 6d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek */ 7d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "gm.h" 8d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "SkGradientShader.h" 9d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek 10d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekusing namespace skiagm; 11d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek 12d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekstruct GradData { 13d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek int fCount; 14d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek const SkColor* fColors; 15d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek const SkScalar* fPos; 16d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek}; 17d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek 18d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekstatic const SkColor gColors[] = { 1988145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, 203d31560343856c573376a04558a7111e7afad4f7Chandler Carruth}; 210a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor 2288145034694ed5267fa6fa5febc54fadc02bd479Steve Naroffstatic const GradData gGradData[] = { 23db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison { 1, gColors, NULL }, 24db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison { 2, gColors, NULL }, 25db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison { 3, gColors, NULL }, 264d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis { 4, gColors, NULL }, 274d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis}; 284d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis 294d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidisstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 304d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm); 314d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis} 324d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis 334d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidisstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 34ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkPoint center; 352d5c133d3dd95507db63147997109f06e8cfa833Argyrios Kyrtzidis center.set(SkScalarAve(pts[0].fX, pts[1].fX), 36ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkScalarAve(pts[0].fY, pts[1].fY)); 37ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis return SkGradientShader::CreateRadial(center, center.fX, data.fColors, 38ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis data.fPos, data.fCount, tm); 39ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis} 40ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis 41ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidisstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) { 42ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkPoint center; 43ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis center.set(SkScalarAve(pts[0].fX, pts[1].fX), 44ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkScalarAve(pts[0].fY, pts[1].fY)); 45ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); 46ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis} 47ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis 48ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidisstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 49ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkPoint center0, center1; 50ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis center0.set(SkScalarAve(pts[0].fX, pts[1].fX), 51ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkScalarAve(pts[0].fY, pts[1].fY)); 52ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), 53ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); 54d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek return SkGradientShader::CreateTwoPointRadial( 55d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek center1, (pts[1].fX - pts[0].fX) / 7, 56d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek center0, (pts[1].fX - pts[0].fX) / 2, 57d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek data.fColors, data.fPos, data.fCount, tm); 5887fb9404cd962b78c98947d75d68be1691c4e737Douglas Gregor} 5920d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor 601efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbarstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 61f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor SkPoint center0, center1; 62f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); 63f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); 64f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor center0.set(pts[0].fX + radius0, pts[0].fY + radius0); 65f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor center1.set(pts[1].fX - radius1, pts[1].fY - radius1); 661efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar return SkGradientShader::CreateTwoPointConical(center1, radius1, 67f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor center0, radius0, 68f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor data.fColors, data.fPos, 69f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor data.fCount, tm); 701efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar} 711efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar 72f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor 7320d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregortypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm); 7420d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor 7520d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregorstatic const GradMaker gGradMakers[] = { 761efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical, 777f17376e0931a337d544b75d9030bc92763be287Douglas Gregor}; 787f17376e0931a337d544b75d9030bc92763be287Douglas Gregor 797f17376e0931a337d544b75d9030bc92763be287Douglas Gregor/////////////////////////////////////////////////////////////////////////////// 807f17376e0931a337d544b75d9030bc92763be287Douglas Gregor 817f17376e0931a337d544b75d9030bc92763be287Douglas Gregorclass GradientsNoTextureGM : public GM { 82600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroffpublic: 837f17376e0931a337d544b75d9030bc92763be287Douglas Gregor GradientsNoTextureGM() { 847f17376e0931a337d544b75d9030bc92763be287Douglas Gregor this->setBGColor(0xFFDDDDDD); 857f17376e0931a337d544b75d9030bc92763be287Douglas Gregor } 860a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek 87600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroffprotected: 887f17376e0931a337d544b75d9030bc92763be287Douglas Gregor virtual uint32_t onGetFlags() const SK_OVERRIDE { 89c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor return kSkipTiled_Flag; 90c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor } 917f17376e0931a337d544b75d9030bc92763be287Douglas Gregor 92c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor SkString onShortName() SK_OVERRIDE { return SkString("gradients_no_texture"); } 931efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 615); } 94735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor 95735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 96735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor static const SkPoint kPts[2] = { { 0, 0 }, 97735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor { SkIntToScalar(50), SkIntToScalar(50) } }; 98735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor static const SkShader::TileMode kTM = SkShader::kClamp_TileMode; 99735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor SkRect kRect = { 0, 0, SkIntToScalar(50), SkIntToScalar(50) }; 100735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor SkPaint paint; 101735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor paint.setAntiAlias(true); 1021efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar 1031efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 104735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor static const uint8_t kAlphas[] = { 0xff, 0x40 }; 105735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) { 106735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) { 107735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor canvas->save(); 108735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) { 1091efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar SkShader* shader = gGradMakers[j](kPts, gGradData[i], kTM); 110c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor paint.setShader(shader)->unref(); 111735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor paint.setAlpha(kAlphas[a]); 112735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor canvas->drawRect(kRect, paint); 113735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor canvas->translate(0, SkIntToScalar(kRect.height() + 20)); 114735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor } 115c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor canvas->restore(); 116735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor canvas->translate(SkIntToScalar(kRect.width() + 20), 0); 117735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor } 118735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor } 119735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor } 120076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne 121076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourneprivate: 122076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne typedef GM INHERITED; 123076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne}; 124076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne 12558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor/////////////////////////////////////////////////////////////////////////////// 126076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne 127076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbournestruct ColorPos { 128076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne SkColor* fColors; 12958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor SkScalar* fPos; 130076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne int fCount; 131076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne 132076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne ColorPos() : fColors(NULL), fPos(NULL), fCount(0) {} 133076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne ~ColorPos() { 13458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor SkDELETE_ARRAY(fColors); 135076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne SkDELETE_ARRAY(fPos); 136076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne } 137076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne 138d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen void construct(const SkColor colors[], const SkScalar pos[], int count) { 139d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen fColors = SkNEW_ARRAY(SkColor, count); 140d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen memcpy(fColors, colors, count * sizeof(SkColor)); 141d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen if (pos) { 142d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen fPos = SkNEW_ARRAY(SkScalar, count); 143d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen memcpy(fPos, pos, count * sizeof(SkScalar)); 14458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor fPos[0] = 0; 145cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor fPos[count - 1] = 1; 146cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor } 147cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor fCount = count; 148cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor } 149cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor}; 150cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 151cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorstatic void make0(ColorPos* rec) { 152cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor#if 0 153cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor From http://jsfiddle.net/3fe2a/ 154cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 155cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorbackground-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%); 156cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorheight: 30px; 157cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor#endif 158cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 159cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor const SkColor colors[] = { 160cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36, 161cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d, 162cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082 163cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor }; 164cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor const double percent[] = { 165cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927, 166cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655, 167cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor 33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876, 16858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442, 1697f17376e0931a337d544b75d9030bc92763be287Douglas Gregor 71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776, 1707eee0184570366285589d788bcd7f5dda8345915James Dennett 84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295, 1717eee0184570366285589d788bcd7f5dda8345915James Dennett }; 1727eee0184570366285589d788bcd7f5dda8345915James Dennett const int N = SK_ARRAY_COUNT(percent); 173e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff SkScalar pos[N]; 174e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff for (int i = 0; i < N; ++i) { 175e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff pos[i] = SkDoubleToScalar(percent[i] / 100); 1761efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar } 177e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff rec->construct(colors, pos, N); 178e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff} 179e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff 180b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroffstatic void make1(ColorPos* rec) { 181b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff const SkColor colors[] = { 1827eee0184570366285589d788bcd7f5dda8345915James Dennett SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1830a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 1840a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor SK_ColorBLACK, 185b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff }; 186b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff rec->construct(colors, NULL, SK_ARRAY_COUNT(colors)); 187b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff} 188b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff 189b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroffstatic void make2(ColorPos* rec) { 190b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff const SkColor colors[] = { 1911efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 192002a528ab0189fc60cfbf9328962c96ccbe567eeDouglas Gregor SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE, 193b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff SK_ColorBLACK, 194b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff }; 195b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff const int N = SK_ARRAY_COUNT(colors); 196b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff SkScalar pos[N]; 197fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar for (int i = 0; i < N; ++i) { 198fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar pos[i] = SK_Scalar1 * i / (N - 1); 199fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar } 200b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor rec->construct(colors, pos, N); 201b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor} 202b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff 2037eee0184570366285589d788bcd7f5dda8345915James Dennettclass GradientsManyColorsGM : public GM { 204b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff enum { 205b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff W = 800, 206b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff }; 207b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff SkAutoTUnref<SkShader> fShader; 208e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff 2090a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor typedef void (*Proc)(ColorPos*); 2100a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregorpublic: 211896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek GradientsManyColorsGM() {} 2120087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor 2130087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregorprotected: 2140087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor virtual uint32_t onGetFlags() const SK_OVERRIDE { 2150087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor return kSkipTiled_Flag; 2160087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor } 2170087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor 2188506dde586459887b7e14e23a30af8ac5be5adb6Daniel Dunbar SkString onShortName() SK_OVERRIDE { return SkString("gradients_many"); } 2191efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(850, 100); } 220fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 221fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 222fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis const Proc procs[] = { 223fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis make0, make1, make2, 224fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis }; 225fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis const SkPoint pts[] = { 226fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis { 0, 0 }, 227fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis { SkIntToScalar(W), 0 }, 228fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis }; 2297eee0184570366285589d788bcd7f5dda8345915James Dennett const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30); 2307eee0184570366285589d788bcd7f5dda8345915James Dennett 2317eee0184570366285589d788bcd7f5dda8345915James Dennett SkPaint paint; 232fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 233fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis canvas->translate(20, 20); 234fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 235fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis for (int i = 0; i <= 8; ++i) { 236fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis SkScalar x = r.width() * i / 8; 237fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis canvas->drawLine(x, 0, x, 10000, paint); 2387eee0184570366285589d788bcd7f5dda8345915James Dennett } 2397eee0184570366285589d788bcd7f5dda8345915James Dennett 2407eee0184570366285589d788bcd7f5dda8345915James Dennett for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 241fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis ColorPos rec; 242fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis procs[i](&rec); 243fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis SkShader* s = SkGradientShader::CreateLinear(pts, rec.fColors, rec.fPos, rec.fCount, 244fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis SkShader::kClamp_TileMode); 245fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis paint.setShader(s)->unref(); 246fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis canvas->drawRect(r, paint); 247fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis canvas->translate(0, r.height() + 20); 248fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis } 249fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis } 250fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 251fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidisprivate: 252fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis typedef GM INHERITED; 253fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis}; 254fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 2557eee0184570366285589d788bcd7f5dda8345915James Dennett/////////////////////////////////////////////////////////////////////////////// 256fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis 257fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios KyrtzidisDEF_GM( return SkNEW(GradientsNoTextureGM)); 258fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios KyrtzidisDEF_GM( return SkNEW(GradientsManyColorsGM)); 259fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis