1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc.
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPoint3.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShadowUtils.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Sample to demonstrate tonal color shadows
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ShadowColorView : public SampleView {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath    fRectPath;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int       fZIndex;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fShowAmbient;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fShowSpot;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fUseAlt;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fShowObject;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fTwoPassColor;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool      fDarkBackground;
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ShadowColorView()
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : fZIndex(8)
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fShowAmbient(true)
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fShowSpot(true)
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fUseAlt(false)
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fShowObject(true)
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fTwoPassColor(false)
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fDarkBackground(false) {}
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRectPath.addRect(SkRect::MakeXYWH(-50, -50, 100, 100));
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // overrides from SkEventSink
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onQuery(SkEvent* evt) override {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::TitleQ(*evt)) {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SampleCode::TitleR(evt, "ShadowColor");
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return true;
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkUnichar uni;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::CharQ(*evt, &uni)) {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bool handled = false;
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            switch (uni) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'W':
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fShowAmbient = !fShowAmbient;
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'S':
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fShowSpot = !fShowSpot;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'T':
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fUseAlt = !fUseAlt;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'O':
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fShowObject = !fShowObject;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'X':
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fTwoPassColor = !fTwoPassColor;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case 'Z':
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fDarkBackground = !fDarkBackground;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case '>':
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fZIndex = SkTMin(9, fZIndex+1);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case '<':
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fZIndex = SkTMax(0, fZIndex-1);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    handled = true;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                default:
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (handled) {
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return true;
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onQuery(evt);
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void drawShadowedPath(SkCanvas* canvas, const SkPath& path,
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkPoint3& zPlaneParams,
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkPaint& paint, SkScalar ambientAlpha,
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkPoint3& lightPos, SkScalar lightWidth, SkScalar spotAlpha) {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fShowAmbient) {
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            ambientAlpha = 0;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fShowSpot) {
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            spotAlpha = 0;
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        uint32_t flags = 0;
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fUseAlt) {
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fTwoPassColor) {
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            flags |= SkShadowFlags::kDisableTonalColor_ShadowFlag;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      lightPos, lightWidth,
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      ambientAlpha, 0, SK_ColorBLACK, flags);
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (paint.getColor() != SK_ColorBLACK) {
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkColor color = paint.getColor();
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                uint8_t max = SkTMax(SkTMax(SkColorGetR(color), SkColorGetG(color)),
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     SkColorGetB(color));
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                uint8_t min = SkTMin(SkTMin(SkColorGetR(color), SkColorGetG(color)),
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     SkColorGetB(color));
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkScalar luminance = 0.5f*(max + min) / 255.f;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkScalar alpha = (.6 - .4*luminance)*luminance*luminance + 0.3f;
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                spotAlpha -= (alpha - 0.3f)*.5f;
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          lightPos, lightWidth,
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          0, alpha, paint.getColor(), flags);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      lightPos, lightWidth,
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      0, spotAlpha, SK_ColorBLACK, flags);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkShadowUtils::DrawShadow(canvas, path, zPlaneParams,
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      lightPos, lightWidth,
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      ambientAlpha, spotAlpha, paint.getColor(), flags);
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fShowObject) {
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(path, paint);
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint strokePaint;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            strokePaint.setColor(paint.getColor());
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            strokePaint.setStyle(SkPaint::kStroke_Style);
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(path, strokePaint);
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawContent(SkCanvas* canvas) override {
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar kLightWidth = 600;
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar kAmbientAlpha = 0.03f;
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar kSpotAlpha = 0.25f;
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar kZValues[10] = { 1, 2, 3, 4, 6, 8, 9, 12, 16, 24 };
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkColor kColors[30] = {
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // purples
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFF3A0072, 0xFF5D0099, 0xFF7F12B2, 0xFFA02AD1, 0xFFC245E5,
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFFE95AF9, 0xFFFC79F0, 0xFFFDA6F0, 0xFFFFCCF8, 0xFFFFE1F9,
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // oranges
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFFEA3200, 0xFFFF4E00, 0xFFFF7300, 0xFFFF9100, 0xFFFFB000,
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFFFFCE00, 0xFFFFE000, 0xFFFFF64D, 0xFFFFF98F, 0xFFFFFBCC,
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // teals
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFF004D51, 0xFF066266, 0xFF057F7F, 0xFF009999, 0xFF00B2B2,
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            0xFF15CCBE, 0xFF25E5CE, 0xFF2CFFE0, 0xFF80FFEA, 0xFFB3FFF0
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(true);
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fDarkBackground) {
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawColor(0xFF111111);
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setColor(SK_ColorWHITE);
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawColor(0xFFEAEAEA);
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setColor(SK_ColorBLACK);
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fTwoPassColor) {
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawText("Two pass", 8, 10, 15, paint);
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawText("One pass", 8, 10, 15, paint);
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint3 lightPos = { 75, -400, 600 };
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint3 zPlaneParams = SkPoint3::Make(0, 0, kZValues[fZIndex]);
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar yPos = 75;
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int row = 0; row < 3; ++row) {
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            lightPos.fX = 75;
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar xPos = 75;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int col = 0; col < 10; ++col) {
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(kColors[10*row + col]);
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(xPos, yPos);
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                this->drawShadowedPath(canvas, fRectPath, zPlaneParams, paint, kAmbientAlpha,
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                       lightPos, kLightWidth, kSpotAlpha);
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                lightPos.fX += 120;
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                xPos += 120;
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            lightPos.fY += 200;
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            yPos += 200;
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SampleView INHERITED;
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ShadowColorView; }
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory);
223