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