1cb93a386Sopenharmony_ci
2cb93a386Sopenharmony_ci/*
3cb93a386Sopenharmony_ci * Copyright 2016 Google Inc.
4cb93a386Sopenharmony_ci *
5cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
6cb93a386Sopenharmony_ci * found in the LICENSE file.
7cb93a386Sopenharmony_ci */
8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
9cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h"
10cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
11cb93a386Sopenharmony_ci#include "include/core/SkPoint3.h"
12cb93a386Sopenharmony_ci#include "include/pathops/SkPathOps.h"
13cb93a386Sopenharmony_ci#include "include/utils/SkCamera.h"
14cb93a386Sopenharmony_ci#include "include/utils/SkShadowUtils.h"
15cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
16cb93a386Sopenharmony_ci#include "src/core/SkBlurMask.h"
17cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h"
18cb93a386Sopenharmony_ci#include "tools/ToolUtils.h"
19cb93a386Sopenharmony_ci#include "tools/timer/TimeUtils.h"
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ciclass ShadowsView : public Sample {
24cb93a386Sopenharmony_ci    SkPath    fRectPath;
25cb93a386Sopenharmony_ci    SkPath    fRRPath;
26cb93a386Sopenharmony_ci    SkPath    fCirclePath;
27cb93a386Sopenharmony_ci    SkPath    fFunkyRRPath;
28cb93a386Sopenharmony_ci    SkPath    fCubicPath;
29cb93a386Sopenharmony_ci    SkPath    fStarPath;
30cb93a386Sopenharmony_ci    SkPath    fSquareRRectPath;
31cb93a386Sopenharmony_ci    SkPath    fWideRectPath;
32cb93a386Sopenharmony_ci    SkPath    fWideOvalPath;
33cb93a386Sopenharmony_ci    SkPath    fNotchPath;
34cb93a386Sopenharmony_ci    SkPath    fTabPath;
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci    SkPoint3  fLightPos;
37cb93a386Sopenharmony_ci    SkScalar  fZDelta = 0;
38cb93a386Sopenharmony_ci    SkScalar  fAnimTranslate = 0;
39cb93a386Sopenharmony_ci    SkScalar  fAnimAngle = 0;
40cb93a386Sopenharmony_ci    SkScalar  fAnimAlpha = 1;
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci    bool      fShowAmbient = true;
43cb93a386Sopenharmony_ci    bool      fShowSpot = true;
44cb93a386Sopenharmony_ci    bool      fUseAlt = false;
45cb93a386Sopenharmony_ci    bool      fShowObject = true;
46cb93a386Sopenharmony_ci    bool      fIgnoreShadowAlpha = false;
47cb93a386Sopenharmony_ci    bool      fDoAlphaAnimation = false;
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    void onOnceBeforeDraw() override {
50cb93a386Sopenharmony_ci        fCirclePath.addCircle(0, 0, 50);
51cb93a386Sopenharmony_ci        fRectPath.addRect(SkRect::MakeXYWH(-100, -50, 200, 100));
52cb93a386Sopenharmony_ci        fRRPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-100, -50, 200, 100), 4, 4));
53cb93a386Sopenharmony_ci        fFunkyRRPath.addRoundRect(SkRect::MakeXYWH(-50, -50, SK_Scalar1 * 100, SK_Scalar1 * 100),
54cb93a386Sopenharmony_ci                                  40 * SK_Scalar1, 20 * SK_Scalar1,
55cb93a386Sopenharmony_ci                                  SkPathDirection::kCW);
56cb93a386Sopenharmony_ci        fCubicPath.cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
57cb93a386Sopenharmony_ci                           20 * SK_Scalar1, 100 * SK_Scalar1,
58cb93a386Sopenharmony_ci                           0 * SK_Scalar1, 0 * SK_Scalar1);
59cb93a386Sopenharmony_ci        fStarPath.moveTo(0.0f, -50.0f);
60cb93a386Sopenharmony_ci        fStarPath.lineTo(14.43f, -25.0f);
61cb93a386Sopenharmony_ci        fStarPath.lineTo(43.30f, -25.0f);
62cb93a386Sopenharmony_ci        fStarPath.lineTo(28.86f, 0.0f);
63cb93a386Sopenharmony_ci        fStarPath.lineTo(43.30f, 25.0f);
64cb93a386Sopenharmony_ci        fStarPath.lineTo(14.43f, 25.0f);
65cb93a386Sopenharmony_ci        fStarPath.lineTo(0.0f, 50.0f);
66cb93a386Sopenharmony_ci        fStarPath.lineTo(-14.43f, 25.0f);
67cb93a386Sopenharmony_ci        fStarPath.lineTo(-43.30f, 25.0f);
68cb93a386Sopenharmony_ci        fStarPath.lineTo(-28.86f, 0.0f);
69cb93a386Sopenharmony_ci        fStarPath.lineTo(-43.30f, -25.0f);
70cb93a386Sopenharmony_ci        fStarPath.lineTo(-14.43f, -25.0f);
71cb93a386Sopenharmony_ci        fSquareRRectPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-50, -50, 100, 100),
72cb93a386Sopenharmony_ci                                                      10, 10));
73cb93a386Sopenharmony_ci        fWideRectPath.addRect(SkRect::MakeXYWH(0, 0, 630, 70));
74cb93a386Sopenharmony_ci        fWideOvalPath.addOval(SkRect::MakeXYWH(0, 0, 630, 70));
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_ci        fNotchPath.moveTo(0, 80);
77cb93a386Sopenharmony_ci        fNotchPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), -90, -90, false);
78cb93a386Sopenharmony_ci        fNotchPath.lineTo(-75, 100);
79cb93a386Sopenharmony_ci        fNotchPath.lineTo(-75, -100);
80cb93a386Sopenharmony_ci        fNotchPath.lineTo(75, -100);
81cb93a386Sopenharmony_ci        fNotchPath.lineTo(75, 100);
82cb93a386Sopenharmony_ci        fNotchPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 0, -90, false);
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci        fTabPath.moveTo(-75, -100);
85cb93a386Sopenharmony_ci        fTabPath.lineTo(75, -100);
86cb93a386Sopenharmony_ci        fTabPath.lineTo(75, 100);
87cb93a386Sopenharmony_ci        fTabPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 0, 90, false);
88cb93a386Sopenharmony_ci        fTabPath.arcTo(SkRect::MakeLTRB(-20, 80, 20, 120), 90, 90, false);
89cb93a386Sopenharmony_ci        fTabPath.lineTo(-75, 100);
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci        fLightPos = SkPoint3::Make(350, 0, 600);
92cb93a386Sopenharmony_ci    }
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci    SkString name() override { return SkString("AndroidShadows"); }
95cb93a386Sopenharmony_ci
96cb93a386Sopenharmony_ci    bool onChar(SkUnichar uni) override {
97cb93a386Sopenharmony_ci            bool handled = false;
98cb93a386Sopenharmony_ci            switch (uni) {
99cb93a386Sopenharmony_ci                case 'W':
100cb93a386Sopenharmony_ci                    fShowAmbient = !fShowAmbient;
101cb93a386Sopenharmony_ci                    handled = true;
102cb93a386Sopenharmony_ci                    break;
103cb93a386Sopenharmony_ci                case 'S':
104cb93a386Sopenharmony_ci                    fShowSpot = !fShowSpot;
105cb93a386Sopenharmony_ci                    handled = true;
106cb93a386Sopenharmony_ci                    break;
107cb93a386Sopenharmony_ci                case 'T':
108cb93a386Sopenharmony_ci                    fUseAlt = !fUseAlt;
109cb93a386Sopenharmony_ci                    handled = true;
110cb93a386Sopenharmony_ci                    break;
111cb93a386Sopenharmony_ci                case 'O':
112cb93a386Sopenharmony_ci                    fShowObject = !fShowObject;
113cb93a386Sopenharmony_ci                    handled = true;
114cb93a386Sopenharmony_ci                    break;
115cb93a386Sopenharmony_ci                case 'N':
116cb93a386Sopenharmony_ci                    fDoAlphaAnimation = !fDoAlphaAnimation;
117cb93a386Sopenharmony_ci                    if (!fDoAlphaAnimation) {
118cb93a386Sopenharmony_ci                        fAnimAlpha = 1;
119cb93a386Sopenharmony_ci                    }
120cb93a386Sopenharmony_ci                    handled = true;
121cb93a386Sopenharmony_ci                    break;
122cb93a386Sopenharmony_ci                case '>':
123cb93a386Sopenharmony_ci                    fZDelta += 0.5f;
124cb93a386Sopenharmony_ci                    handled = true;
125cb93a386Sopenharmony_ci                    break;
126cb93a386Sopenharmony_ci                case '<':
127cb93a386Sopenharmony_ci                    fZDelta -= 0.5f;
128cb93a386Sopenharmony_ci                    handled = true;
129cb93a386Sopenharmony_ci                    break;
130cb93a386Sopenharmony_ci                case '?':
131cb93a386Sopenharmony_ci                    fIgnoreShadowAlpha = !fIgnoreShadowAlpha;
132cb93a386Sopenharmony_ci                    handled = true;
133cb93a386Sopenharmony_ci                    break;
134cb93a386Sopenharmony_ci                default:
135cb93a386Sopenharmony_ci                    break;
136cb93a386Sopenharmony_ci            }
137cb93a386Sopenharmony_ci            if (handled) {
138cb93a386Sopenharmony_ci                return true;
139cb93a386Sopenharmony_ci            }
140cb93a386Sopenharmony_ci            return false;
141cb93a386Sopenharmony_ci    }
142cb93a386Sopenharmony_ci
143cb93a386Sopenharmony_ci    void drawShadowedPath(SkCanvas* canvas, const SkPath& path,
144cb93a386Sopenharmony_ci                          const SkPoint3& zPlaneParams,
145cb93a386Sopenharmony_ci                          const SkPaint& paint, SkScalar ambientAlpha,
146cb93a386Sopenharmony_ci                          const SkPoint3& lightPos, SkScalar lightWidth, SkScalar spotAlpha) {
147cb93a386Sopenharmony_ci        if (fIgnoreShadowAlpha) {
148cb93a386Sopenharmony_ci            ambientAlpha = 1;
149cb93a386Sopenharmony_ci            spotAlpha = 1;
150cb93a386Sopenharmony_ci        }
151cb93a386Sopenharmony_ci        if (!fShowAmbient) {
152cb93a386Sopenharmony_ci            ambientAlpha = 0;
153cb93a386Sopenharmony_ci        }
154cb93a386Sopenharmony_ci        if (!fShowSpot) {
155cb93a386Sopenharmony_ci            spotAlpha = 0;
156cb93a386Sopenharmony_ci        }
157cb93a386Sopenharmony_ci        uint32_t flags = 0;
158cb93a386Sopenharmony_ci        if (fUseAlt) {
159cb93a386Sopenharmony_ci            flags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
160cb93a386Sopenharmony_ci        }
161cb93a386Sopenharmony_ci
162cb93a386Sopenharmony_ci        SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 0, 0, 0);
163cb93a386Sopenharmony_ci        SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 0);
164cb93a386Sopenharmony_ci        SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, lightPos, lightWidth,
165cb93a386Sopenharmony_ci                                  ambientColor, spotColor, flags);
166cb93a386Sopenharmony_ci
167cb93a386Sopenharmony_ci        if (fShowObject) {
168cb93a386Sopenharmony_ci            canvas->drawPath(path, paint);
169cb93a386Sopenharmony_ci        } else {
170cb93a386Sopenharmony_ci            SkPaint strokePaint;
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_ci            strokePaint.setColor(paint.getColor());
173cb93a386Sopenharmony_ci            strokePaint.setStyle(SkPaint::kStroke_Style);
174cb93a386Sopenharmony_ci
175cb93a386Sopenharmony_ci            canvas->drawPath(path, strokePaint);
176cb93a386Sopenharmony_ci        }
177cb93a386Sopenharmony_ci    }
178cb93a386Sopenharmony_ci
179cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
180cb93a386Sopenharmony_ci        canvas->drawColor(0xFFDDDDDD);
181cb93a386Sopenharmony_ci
182cb93a386Sopenharmony_ci        const SkScalar kLightWidth = 800;
183cb93a386Sopenharmony_ci        const SkScalar kAmbientAlpha = 0.039f;
184cb93a386Sopenharmony_ci        const SkScalar kSpotAlpha = 0.19f;
185cb93a386Sopenharmony_ci
186cb93a386Sopenharmony_ci        SkPaint paint;
187cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
188cb93a386Sopenharmony_ci
189cb93a386Sopenharmony_ci        SkPoint3 lightPos = fLightPos;
190cb93a386Sopenharmony_ci        SkPoint3 zPlaneParams = SkPoint3::Make(0, 0, 0);
191cb93a386Sopenharmony_ci
192cb93a386Sopenharmony_ci        paint.setColor(SK_ColorWHITE);
193cb93a386Sopenharmony_ci        canvas->translate(200, 90);
194cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 2 + fZDelta);
195cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
196cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
197cb93a386Sopenharmony_ci
198cb93a386Sopenharmony_ci        paint.setColor(SK_ColorRED);
199cb93a386Sopenharmony_ci        canvas->translate(250, 0);
200cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 8 + fZDelta);
201cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fRectPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
202cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
203cb93a386Sopenharmony_ci
204cb93a386Sopenharmony_ci        paint.setColor(SK_ColorBLUE);
205cb93a386Sopenharmony_ci        canvas->translate(-250, 110);
206cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 12 + fZDelta);
207cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fCirclePath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
208cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*0.5f);
209cb93a386Sopenharmony_ci
210cb93a386Sopenharmony_ci        paint.setColor(SK_ColorGREEN);
211cb93a386Sopenharmony_ci        canvas->translate(250, 0);
212cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 64 + fZDelta);
213cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
214cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
215cb93a386Sopenharmony_ci
216cb93a386Sopenharmony_ci        paint.setColor(SK_ColorYELLOW);
217cb93a386Sopenharmony_ci        canvas->translate(-250, 110);
218cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 8 + fZDelta);
219cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fFunkyRRPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
220cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
221cb93a386Sopenharmony_ci
222cb93a386Sopenharmony_ci        paint.setColor(SK_ColorCYAN);
223cb93a386Sopenharmony_ci        canvas->translate(250, 0);
224cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 16 + fZDelta);
225cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fCubicPath, zPlaneParams, paint, fAnimAlpha*kAmbientAlpha,
226cb93a386Sopenharmony_ci                               lightPos, kLightWidth, fAnimAlpha*kSpotAlpha);
227cb93a386Sopenharmony_ci
228cb93a386Sopenharmony_ci        paint.setColor(SK_ColorWHITE);
229cb93a386Sopenharmony_ci        canvas->translate(250, -180);
230cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 8 + fZDelta);
231cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fStarPath, zPlaneParams, paint,
232cb93a386Sopenharmony_ci                               kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
233cb93a386Sopenharmony_ci
234cb93a386Sopenharmony_ci        paint.setColor(SK_ColorWHITE);
235cb93a386Sopenharmony_ci        canvas->translate(150, 0);
236cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 2 + fZDelta);
237cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fNotchPath, zPlaneParams, paint,
238cb93a386Sopenharmony_ci                               kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
239cb93a386Sopenharmony_ci
240cb93a386Sopenharmony_ci        paint.setColor(SK_ColorWHITE);
241cb93a386Sopenharmony_ci        canvas->translate(200, 0);
242cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 16 + fZDelta);
243cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fTabPath, zPlaneParams, paint,
244cb93a386Sopenharmony_ci                               kAmbientAlpha, lightPos, kLightWidth, kSpotAlpha);
245cb93a386Sopenharmony_ci
246cb93a386Sopenharmony_ci        // circular reveal
247cb93a386Sopenharmony_ci        SkPath tmpPath;
248cb93a386Sopenharmony_ci        SkPath tmpClipPath;
249cb93a386Sopenharmony_ci        tmpClipPath.addCircle(fAnimTranslate, 0, 60);
250cb93a386Sopenharmony_ci        Op(fSquareRRectPath, tmpClipPath, kIntersect_SkPathOp, &tmpPath);
251cb93a386Sopenharmony_ci
252cb93a386Sopenharmony_ci        paint.setColor(SK_ColorMAGENTA);
253cb93a386Sopenharmony_ci        canvas->translate(-725, 240);
254cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 32 + fZDelta);
255cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, tmpPath, zPlaneParams, paint, .1f,
256cb93a386Sopenharmony_ci                               lightPos, kLightWidth, .5f);
257cb93a386Sopenharmony_ci
258cb93a386Sopenharmony_ci        // path ops bug
259cb93a386Sopenharmony_ci        SkPath tmpClipPathBug;
260cb93a386Sopenharmony_ci        tmpClipPathBug.addCircle(88.0344925f, 0, 60);
261cb93a386Sopenharmony_ci        Op(fSquareRRectPath, tmpClipPathBug, kIntersect_SkPathOp, &tmpPath);
262cb93a386Sopenharmony_ci
263cb93a386Sopenharmony_ci        canvas->translate(250, 0);
264cb93a386Sopenharmony_ci        zPlaneParams.fZ = std::max(1.0f, 32 + fZDelta);
265cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, tmpPath, zPlaneParams, paint, .1f,
266cb93a386Sopenharmony_ci                               lightPos, kLightWidth, .5f);
267cb93a386Sopenharmony_ci
268cb93a386Sopenharmony_ci        // perspective paths
269cb93a386Sopenharmony_ci        SkPoint pivot = SkPoint::Make(fWideRectPath.getBounds().width()/2,
270cb93a386Sopenharmony_ci                                      fWideRectPath.getBounds().height()/2);
271cb93a386Sopenharmony_ci        SkPoint translate = SkPoint::Make(100, 450);
272cb93a386Sopenharmony_ci        paint.setColor(SK_ColorWHITE);
273cb93a386Sopenharmony_ci        Sk3DView view;
274cb93a386Sopenharmony_ci        view.save();
275cb93a386Sopenharmony_ci        view.rotateX(fAnimAngle);
276cb93a386Sopenharmony_ci        SkMatrix persp;
277cb93a386Sopenharmony_ci        view.getMatrix(&persp);
278cb93a386Sopenharmony_ci        persp.preTranslate(-pivot.fX, -pivot.fY);
279cb93a386Sopenharmony_ci        persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
280cb93a386Sopenharmony_ci        canvas->setMatrix(persp);
281cb93a386Sopenharmony_ci        SkScalar radians = SkDegreesToRadians(fAnimAngle);
282cb93a386Sopenharmony_ci        zPlaneParams = SkPoint3::Make(0,
283cb93a386Sopenharmony_ci                                      SkScalarSin(radians),
284cb93a386Sopenharmony_ci                                      std::max(1.0f, 16 + fZDelta) - SkScalarSin(radians)*pivot.fY);
285cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fWideRectPath, zPlaneParams, paint, .1f,
286cb93a386Sopenharmony_ci                               lightPos, kLightWidth, .5f);
287cb93a386Sopenharmony_ci
288cb93a386Sopenharmony_ci        pivot = SkPoint::Make(fWideOvalPath.getBounds().width() / 2,
289cb93a386Sopenharmony_ci                              fWideOvalPath.getBounds().height() / 2);
290cb93a386Sopenharmony_ci        translate = SkPoint::Make(100, 600);
291cb93a386Sopenharmony_ci        view.restore();
292cb93a386Sopenharmony_ci        view.save();
293cb93a386Sopenharmony_ci        view.rotateY(fAnimAngle);
294cb93a386Sopenharmony_ci        view.getMatrix(&persp);
295cb93a386Sopenharmony_ci        persp.preTranslate(-pivot.fX, -pivot.fY);
296cb93a386Sopenharmony_ci        persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
297cb93a386Sopenharmony_ci        canvas->setMatrix(persp);
298cb93a386Sopenharmony_ci        zPlaneParams = SkPoint3::Make(-SkScalarSin(radians),
299cb93a386Sopenharmony_ci                                      0,
300cb93a386Sopenharmony_ci                                      std::max(1.0f, 32 + fZDelta) + SkScalarSin(radians)*pivot.fX);
301cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fWideOvalPath, zPlaneParams, paint, .1f,
302cb93a386Sopenharmony_ci                               lightPos, kLightWidth, .5f);
303cb93a386Sopenharmony_ci
304cb93a386Sopenharmony_ci        pivot = SkPoint::Make(fStarPath.getBounds().width() / 2,
305cb93a386Sopenharmony_ci                              fStarPath.getBounds().height() / 2);
306cb93a386Sopenharmony_ci        translate = SkPoint::Make(700, 250);
307cb93a386Sopenharmony_ci        view.restore();
308cb93a386Sopenharmony_ci        view.rotateY(fAnimAngle);
309cb93a386Sopenharmony_ci        view.getMatrix(&persp);
310cb93a386Sopenharmony_ci        persp.preTranslate(-pivot.fX, -pivot.fY);
311cb93a386Sopenharmony_ci        persp.postTranslate(pivot.fX + translate.fX, pivot.fY + translate.fY);
312cb93a386Sopenharmony_ci        canvas->setMatrix(persp);
313cb93a386Sopenharmony_ci        zPlaneParams = SkPoint3::Make(-SkScalarSin(radians),
314cb93a386Sopenharmony_ci                                      0,
315cb93a386Sopenharmony_ci                                      std::max(1.0f, 8 + fZDelta) + SkScalarSin(radians)*pivot.fX);
316cb93a386Sopenharmony_ci        this->drawShadowedPath(canvas, fStarPath, zPlaneParams, paint, .1f,
317cb93a386Sopenharmony_ci                               lightPos, kLightWidth, .5f);
318cb93a386Sopenharmony_ci    }
319cb93a386Sopenharmony_ci
320cb93a386Sopenharmony_ci    bool onAnimate(double nanos) override {
321cb93a386Sopenharmony_ci        fAnimTranslate = TimeUtils::PingPong(1e-9 * nanos, 30, 0, 125, -125);
322cb93a386Sopenharmony_ci        fAnimAngle = TimeUtils::PingPong(1e-9 * nanos, 15, 0, 0, 20);
323cb93a386Sopenharmony_ci        if (fDoAlphaAnimation) {
324cb93a386Sopenharmony_ci            fAnimAlpha = TimeUtils::PingPong(1e-9 * nanos, 5, 0, 1, 0);
325cb93a386Sopenharmony_ci        }
326cb93a386Sopenharmony_ci        return true;
327cb93a386Sopenharmony_ci    }
328cb93a386Sopenharmony_ci
329cb93a386Sopenharmony_ciprivate:
330cb93a386Sopenharmony_ci    using INHERITED = Sample;
331cb93a386Sopenharmony_ci};
332cb93a386Sopenharmony_ci
333cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
334cb93a386Sopenharmony_ci
335cb93a386Sopenharmony_ciDEF_SAMPLE( return new ShadowsView(); )
336