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