1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.view.shadow;
18 
19 /**
20  * Model for ambient shadow rendering. Assumes light sources from centroid of the object.
21  */
22 class AmbientShadowConfig {
23 
24     private final int mWidth;
25     private final int mHeight;
26 
27     private final float mEdgeScale;
28     private final float mShadowBoundRatio;
29     private final float mShadowStrength;
30 
31     private final float[] mPolygon;
32 
33     private final int mRays;
34     private final int mLayers;
35 
AmbientShadowConfig(Builder builder)36     private AmbientShadowConfig(Builder builder) {
37         mEdgeScale = builder.mEdgeScale;
38         mShadowBoundRatio = builder.mShadowBoundRatio;
39         mShadowStrength = builder.mShadowStrength;
40         mRays = builder.mRays;
41         mLayers = builder.mLayers;
42         mWidth = builder.mWidth;
43         mHeight = builder.mHeight;
44         mPolygon = builder.mPolygon;
45     }
46 
getWidth()47     public int getWidth() {
48         return mWidth;
49     }
50 
getHeight()51     public int getHeight() {
52         return mHeight;
53     }
54 
55     /**
56      * Returns scales intensity of the edge of the shadow (opacity) [0-100]
57      */
getEdgeScale()58     public float getEdgeScale() {
59         return mEdgeScale;
60     }
61 
62     /**
63      * Returns scales the area (in xy) of the shadow [0-1]
64      */
getShadowBoundRatio()65     public float getShadowBoundRatio() {
66         return mShadowBoundRatio;
67     }
68 
69     /**
70      * Returns scales the intensity of the entire shadow (opacity) [0-1]
71      */
getShadowStrength()72     public float getShadowStrength() {
73         return mShadowStrength;
74     }
75 
76     /**
77      * Returns opaque polygon to cast shadow
78      */
getPolygon()79     public float[] getPolygon() {
80         return mPolygon;
81     }
82 
83     /**
84      * Returns # of rays to use in ray tracing. It determines the accuracy of outline (bounds) of
85      * the shadow.
86      */
getRays()87     public int getRays() {
88         return mRays;
89     }
90 
91     /**
92      * Returns # of layers. It determines the intensity of the pen-umbra.
93      */
getLayers()94     public int getLayers() {
95         return mLayers;
96     }
97 
98     public static class Builder {
99 
100         private float mEdgeScale;
101         private float mShadowBoundRatio;
102         private float mShadowStrength;
103         private int mRays;
104         private int mLayers;
105 
106         private float[] mPolygon;
107 
108         private int mWidth;
109         private int mHeight;
110 
setEdgeScale(float edgeScale)111         public Builder setEdgeScale(float edgeScale) {
112             mEdgeScale = edgeScale;
113             return this;
114         }
115 
setShadowBoundRatio(float shadowBoundRatio)116         public Builder setShadowBoundRatio(float shadowBoundRatio) {
117             mShadowBoundRatio = shadowBoundRatio;
118             return this;
119         }
120 
setShadowStrength(float shadowStrength)121         public Builder setShadowStrength(float shadowStrength) {
122             mShadowStrength = shadowStrength;
123             return this;
124         }
125 
setRays(int rays)126         public Builder setRays(int rays) {
127             mRays = rays;
128             return this;
129         }
130 
setLayers(int layers)131         public Builder setLayers(int layers) {
132             mLayers = layers;
133             return this;
134         }
135 
setSize(int width, int height)136         public Builder setSize(int width, int height) {
137             mWidth = width;
138             mHeight = height;
139             return this;
140         }
141 
setPolygon(float[] polygon)142         public Builder setPolygon(float[] polygon) {
143             mPolygon = polygon;
144             return this;
145         }
146 
build()147         public AmbientShadowConfig build() {
148             return new AmbientShadowConfig(this);
149         }
150     }
151 }
152