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 */ 8a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com#include "SampleCode.h" 9a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com#include "SkView.h" 10a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com#include "SkCanvas.h" 11a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com#include "SkGradientShader.h" 12a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 131c12abe3508cd69615c2dd50653f782835e325cereed@android.comstatic SkShader* setgrad(const SkRect& r, SkColor c0, SkColor c1) { 141c12abe3508cd69615c2dd50653f782835e325cereed@android.com SkColor colors[] = { c0, c1 }; 151c12abe3508cd69615c2dd50653f782835e325cereed@android.com SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } }; 1683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org return SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 171c12abe3508cd69615c2dd50653f782835e325cereed@android.com} 181c12abe3508cd69615c2dd50653f782835e325cereed@android.com 191c12abe3508cd69615c2dd50653f782835e325cereed@android.comstatic void test_alphagradients(SkCanvas* canvas) { 201c12abe3508cd69615c2dd50653f782835e325cereed@android.com SkRect r; 211c12abe3508cd69615c2dd50653f782835e325cereed@android.com r.set(SkIntToScalar(10), SkIntToScalar(10), 221c12abe3508cd69615c2dd50653f782835e325cereed@android.com SkIntToScalar(410), SkIntToScalar(30)); 231c12abe3508cd69615c2dd50653f782835e325cereed@android.com SkPaint p, p2; 241c12abe3508cd69615c2dd50653f782835e325cereed@android.com p2.setStyle(SkPaint::kStroke_Style); 25ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 261c12abe3508cd69615c2dd50653f782835e325cereed@android.com p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00))->unref(); 271c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p); 281c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p2); 29ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 301c12abe3508cd69615c2dd50653f782835e325cereed@android.com r.offset(0, r.height() + SkIntToScalar(4)); 311c12abe3508cd69615c2dd50653f782835e325cereed@android.com p.setShader(setgrad(r, 0xFF00FF00, 0x00000000))->unref(); 321c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p); 331c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p2); 34ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 351c12abe3508cd69615c2dd50653f782835e325cereed@android.com r.offset(0, r.height() + SkIntToScalar(4)); 361c12abe3508cd69615c2dd50653f782835e325cereed@android.com p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000))->unref(); 371c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p); 381c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->drawRect(r, p2); 391c12abe3508cd69615c2dd50653f782835e325cereed@android.com} 401c12abe3508cd69615c2dd50653f782835e325cereed@android.com 411c12abe3508cd69615c2dd50653f782835e325cereed@android.com/////////////////////////////////////////////////////////////////////////////// 421c12abe3508cd69615c2dd50653f782835e325cereed@android.com 43a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstruct GradData { 44a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com int fCount; 45a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com const SkColor* fColors; 46a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com const SkScalar* fPos; 47a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 48a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 49a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const SkColor gColors[] = { 50a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK 51a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 52a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const SkScalar gPos0[] = { 0, SK_Scalar1 }; 53a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; 54a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const SkScalar gPos2[] = { 55a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 56a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 57a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 58a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const GradData gGradData[] = { 59a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 2, gColors, NULL }, 60a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 2, gColors, gPos0 }, 61a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 2, gColors, gPos1 }, 62a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 5, gColors, NULL }, 63a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 5, gColors, gPos2 } 64a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 65a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 6683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 6783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm); 68a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com} 69ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 7083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 71a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkPoint center; 72a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 73a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkScalarAve(pts[0].fY, pts[1].fY)); 74a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com return SkGradientShader::CreateRadial(center, center.fX, data.fColors, 7583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fPos, data.fCount, tm); 76a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com} 77a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 7883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 79a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkPoint center; 80a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 81a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkScalarAve(pts[0].fY, pts[1].fY)); 8283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount); 83a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com} 84a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 8583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) { 868e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com SkPoint center0, center1; 878e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com center0.set(SkScalarAve(pts[0].fX, pts[1].fX), 888e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com SkScalarAve(pts[0].fY, pts[1].fY)); 898e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), 908e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); 918e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com return SkGradientShader::CreateTwoPointRadial( 928e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com center1, (pts[1].fX - pts[0].fX) / 7, 938e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com center0, (pts[1].fX - pts[0].fX) / 2, 9483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fColors, data.fPos, data.fCount, tm); 958e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com} 968e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com 97dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.comstatic SkShader* Make2RadialConcentric(const SkPoint pts[2], const GradData& data, 9883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::TileMode tm) { 99dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com SkPoint center; 100dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com center.set(SkScalarAve(pts[0].fX, pts[1].fX), 101dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com SkScalarAve(pts[0].fY, pts[1].fY)); 102dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com return SkGradientShader::CreateTwoPointRadial( 103dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com center, (pts[1].fX - pts[0].fX) / 7, 104dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com center, (pts[1].fX - pts[0].fX) / 2, 10583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org data.fColors, data.fPos, data.fCount, tm); 106dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com} 107dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com 10883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm); 10983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org 110a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic const GradMaker gGradMakers[] = { 111dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2RadialConcentric 112a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 113a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 114a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com/////////////////////////////////////////////////////////////////////////////// 115a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 116f21833999d90ad9c8c584cff3238797b39cfc00breed@google.comclass GradientsView : public SampleView { 117a3c0588694782b4771c7d579b928d6b94b7de364reed@android.compublic: 118ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com GradientsView() { 119f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com this->setBGColor(0xFFDDDDDD); 120f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com } 121ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 122a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comprotected: 123a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com // overrides from SkEventSink 124a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com virtual bool onQuery(SkEvent* evt) { 125a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com if (SampleCode::TitleQ(*evt)) { 126a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SampleCode::TitleR(evt, "Gradients"); 127a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com return true; 128a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com } 129a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com return this->INHERITED::onQuery(evt); 130a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com } 131a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 132f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com virtual void onDrawContent(SkCanvas* canvas) { 133a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkPoint pts[2] = { 134a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { 0, 0 }, 135a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com { SkIntToScalar(100), SkIntToScalar(100) } 136a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com }; 137a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 138a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com SkPaint paint; 13932a4249cbd3ebcb448fb0824afe875cdf9036686reed@android.com paint.setDither(true); 1401c12abe3508cd69615c2dd50653f782835e325cereed@android.com 1411c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->save(); 1428e2af7eb8979ddd97bfd1615ccc173e66fe902d6reed@android.com canvas->translate(SkIntToScalar(20), SkIntToScalar(10)); 143dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com 144dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com for (int tm = 0; tm < SkShader::kTileModeCount; ++tm) { 145a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com canvas->save(); 146dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 147dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->save(); 148dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 149dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com SkShader* shader; 15083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org shader = gGradMakers[j](pts, gGradData[i], (SkShader::TileMode)tm); 151dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com paint.setShader(shader)->unref(); 152dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->drawRect(r, paint); 153dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->translate(0, SkIntToScalar(120)); 154dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com } 155dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->restore(); 156dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->translate(SkIntToScalar(120), 0); 157a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com } 158a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com canvas->restore(); 159dc66c42d7d48d76db7b54f3c864e74637777a176bsalomon@google.com canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0); 160a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com } 1611c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->restore(); 162ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1631c12abe3508cd69615c2dd50653f782835e325cereed@android.com canvas->translate(0, SkIntToScalar(370)); 16402939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com if (false) { // avoid bit rot, suppress warning 16502939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com test_alphagradients(canvas); 16602939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com } 167f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com this->inval(NULL); 168a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com } 169ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 170a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comprivate: 171f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com typedef SampleView INHERITED; 172a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com}; 173a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 174a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com/////////////////////////////////////////////////////////////////////////////// 175a3c0588694782b4771c7d579b928d6b94b7de364reed@android.com 176a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic SkView* MyFactory() { return new GradientsView; } 177a3c0588694782b4771c7d579b928d6b94b7de364reed@android.comstatic SkViewRegister reg(MyFactory); 178