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