1 2 /* 3 * Copyright 2020 Google LLC 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "include/core/SkCanvas.h" 9 #include "include/core/SkColorFilter.h" 10 #include "include/core/SkPath.h" 11 #include "include/core/SkPoint3.h" 12 #include "include/core/SkRRect.h" 13 #include "include/utils/SkCamera.h" 14 #include "include/utils/SkShadowUtils.h" 15 #include "src/base/SkUTF.h" 16 #include "src/core/SkBlurMask.h" 17 #include "tools/ToolUtils.h" 18 #include "tools/timer/TimeUtils.h" 19 #include "tools/viewer/Slide.h" 20 21 //////////////////////////////////////////////////////////////////////////// 22 23 class MaterialShadowsSlide : public Slide { 24 SkPath fCirclePath; 25 SkPath fCapsulePath; 26 SkPath fLargeRRPath; 27 SkPath fSmallRRPath; 28 29 SkPoint3 fLightPos; 30 31 public: MaterialShadowsSlide()32 MaterialShadowsSlide() { fName = "MaterialShadows"; } 33 load(SkScalar w,SkScalar h)34 void load(SkScalar w, SkScalar h) override { 35 fCirclePath.addCircle(0, 0, 56/2); 36 fCapsulePath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-64, -24, 128, 48), 24, 24)); 37 fLargeRRPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-64, -64, 128, 128), 4, 4)); 38 fSmallRRPath.addRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(-40, -40, 80, 80), 4, 4)); 39 40 fLightPos = SkPoint3::Make(0, -700, 700); 41 } 42 drawShadowedPath(SkCanvas * canvas,const SkPath & path,const SkPoint3 & zPlaneParams,const SkPaint & paint,SkScalar ambientAlpha,const SkPoint3 & lightPos,SkScalar lightRadius,SkScalar spotAlpha)43 void drawShadowedPath(SkCanvas* canvas, const SkPath& path, 44 const SkPoint3& zPlaneParams, 45 const SkPaint& paint, SkScalar ambientAlpha, 46 const SkPoint3& lightPos, SkScalar lightRadius, SkScalar spotAlpha) { 47 uint32_t flags = 0; 48 flags |= SkShadowFlags::kDirectionalLight_ShadowFlag; 49 50 SkColor ambientColor = SkColorSetARGB(ambientAlpha * 255, 0, 0, 0); 51 SkColor spotColor = SkColorSetARGB(spotAlpha * 255, 0, 0, 0); 52 SkShadowUtils::DrawShadow(canvas, path, zPlaneParams, lightPos, lightRadius, 53 ambientColor, spotColor, flags); 54 55 canvas->drawPath(path, paint); 56 } 57 draw(SkCanvas * canvas)58 void draw(SkCanvas* canvas) override { 59 canvas->drawColor(0xFFFFFFFF); 60 61 const SkScalar kLightRadius = 1.1f; 62 const SkScalar kAmbientAlpha = 0.05f; 63 const SkScalar kSpotAlpha = 0.35f; 64 65 const SkScalar elevations[] = { 1, 3, 6, 8, 12, 24 }; 66 67 SkPaint paint; 68 paint.setAntiAlias(true); 69 70 SkPoint3 lightPos = fLightPos; 71 SkPoint3 zPlaneParams = SkPoint3::Make(0, 0, 0); 72 73 paint.setColor(SK_ColorWHITE); 74 canvas->save(); 75 canvas->translate(80, 80); 76 for (unsigned int i = 0; i < std::size(elevations); ++i) { 77 zPlaneParams.fZ = elevations[i]; 78 this->drawShadowedPath(canvas, fCirclePath, zPlaneParams, paint, kAmbientAlpha, 79 lightPos, kLightRadius, kSpotAlpha); 80 canvas->translate(80, 0); 81 } 82 canvas->restore(); 83 84 canvas->save(); 85 canvas->translate(120, 175); 86 for (unsigned int i = 0; i < std::size(elevations); ++i) { 87 zPlaneParams.fZ = elevations[i]; 88 this->drawShadowedPath(canvas, fCapsulePath, zPlaneParams, paint, kAmbientAlpha, 89 lightPos, kLightRadius, kSpotAlpha); 90 canvas->translate(160, 0); 91 } 92 canvas->restore(); 93 94 canvas->save(); 95 canvas->translate(120, 320); 96 for (unsigned int i = 0; i < std::size(elevations); ++i) { 97 zPlaneParams.fZ = elevations[i]; 98 this->drawShadowedPath(canvas, fLargeRRPath, zPlaneParams, paint, kAmbientAlpha, 99 lightPos, kLightRadius, kSpotAlpha); 100 canvas->translate(160, 0); 101 } 102 canvas->restore(); 103 104 canvas->save(); 105 canvas->translate(100, 475); 106 for (unsigned int i = 0; i < std::size(elevations); ++i) { 107 zPlaneParams.fZ = elevations[i]; 108 this->drawShadowedPath(canvas, fSmallRRPath, zPlaneParams, paint, kAmbientAlpha, 109 lightPos, kLightRadius, kSpotAlpha); 110 canvas->translate(160, 0); 111 } 112 canvas->restore(); 113 114 canvas->save(); 115 canvas->translate(100, 600); 116 for (unsigned int i = 0; i < std::size(elevations); ++i) { 117 canvas->save(); 118 zPlaneParams.fZ = elevations[i]; 119 canvas->rotate(10); 120 this->drawShadowedPath(canvas, fSmallRRPath, zPlaneParams, paint, kAmbientAlpha, 121 lightPos, kLightRadius, kSpotAlpha); 122 canvas->restore(); 123 canvas->translate(160, 0); 124 } 125 canvas->restore(); 126 127 canvas->save(); 128 canvas->translate(100, 725); 129 for (unsigned int i = 0; i < std::size(elevations); ++i) { 130 canvas->save(); 131 zPlaneParams.fZ = elevations[i]; 132 canvas->rotate(45); 133 this->drawShadowedPath(canvas, fSmallRRPath, zPlaneParams, paint, kAmbientAlpha, 134 lightPos, kLightRadius, kSpotAlpha); 135 canvas->restore(); 136 canvas->translate(160, 0); 137 } 138 canvas->restore(); 139 140 } 141 }; 142 143 ////////////////////////////////////////////////////////////////////////////// 144 145 DEF_SLIDE( return new MaterialShadowsSlide(); ) 146