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