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