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