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