OLD | NEW |
| (Empty) |
1 /* libs/graphics/animator/SkDisplayMath.cpp | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
4 ** | |
5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
6 ** you may not use this file except in compliance with the License. | |
7 ** You may obtain a copy of the License at | |
8 ** | |
9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
10 ** | |
11 ** Unless required by applicable law or agreed to in writing, software | |
12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 ** See the License for the specific language governing permissions and | |
15 ** limitations under the License. | |
16 */ | |
17 | |
18 #include "SkDisplayMath.h" | |
19 | |
20 enum SkDisplayMath_Properties { | |
21 SK_PROPERTY(E), | |
22 SK_PROPERTY(LN10), | |
23 SK_PROPERTY(LN2), | |
24 SK_PROPERTY(LOG10E), | |
25 SK_PROPERTY(LOG2E), | |
26 SK_PROPERTY(PI), | |
27 SK_PROPERTY(SQRT1_2), | |
28 SK_PROPERTY(SQRT2) | |
29 }; | |
30 | |
31 const SkScalar SkDisplayMath::gConstants[] = { | |
32 #ifdef SK_SCALAR_IS_FLOAT | |
33 2.718281828f, // E | |
34 2.302585093f, // LN10 | |
35 0.693147181f, // LN2 | |
36 0.434294482f, // LOG10E | |
37 1.442695041f, // LOG2E | |
38 3.141592654f, // PI | |
39 0.707106781f, // SQRT1_2 | |
40 1.414213562f // SQRT2 | |
41 #else | |
42 0x2B7E1, // E | |
43 0x24D76, // LN10 | |
44 0xB172, // LN2 | |
45 0x6F2E, // LOG10E | |
46 0x17154, // LOG2E | |
47 0x3243F, // PI | |
48 0xB505, // SQRT1_2 | |
49 0x16A0A // SQRT2 | |
50 #endif | |
51 }; | |
52 | |
53 enum SkDisplayMath_Functions { | |
54 SK_FUNCTION(abs), | |
55 SK_FUNCTION(acos), | |
56 SK_FUNCTION(asin), | |
57 SK_FUNCTION(atan), | |
58 SK_FUNCTION(atan2), | |
59 SK_FUNCTION(ceil), | |
60 SK_FUNCTION(cos), | |
61 SK_FUNCTION(exp), | |
62 SK_FUNCTION(floor), | |
63 SK_FUNCTION(log), | |
64 SK_FUNCTION(max), | |
65 SK_FUNCTION(min), | |
66 SK_FUNCTION(pow), | |
67 SK_FUNCTION(random), | |
68 SK_FUNCTION(round), | |
69 SK_FUNCTION(sin), | |
70 SK_FUNCTION(sqrt), | |
71 SK_FUNCTION(tan) | |
72 }; | |
73 | |
74 const SkFunctionParamType SkDisplayMath::fFunctionParameters[] = { | |
75 (SkFunctionParamType) SkType_Float, // abs | |
76 (SkFunctionParamType) 0, | |
77 (SkFunctionParamType) SkType_Float, // acos | |
78 (SkFunctionParamType) 0, | |
79 (SkFunctionParamType) SkType_Float, // asin | |
80 (SkFunctionParamType) 0, | |
81 (SkFunctionParamType) SkType_Float, // atan | |
82 (SkFunctionParamType) 0, | |
83 (SkFunctionParamType) SkType_Float, // atan2 | |
84 (SkFunctionParamType) SkType_Float, | |
85 (SkFunctionParamType) 0, | |
86 (SkFunctionParamType) SkType_Float, // ceil | |
87 (SkFunctionParamType) 0, | |
88 (SkFunctionParamType) SkType_Float, // cos | |
89 (SkFunctionParamType) 0, | |
90 (SkFunctionParamType) SkType_Float, // exp | |
91 (SkFunctionParamType) 0, | |
92 (SkFunctionParamType) SkType_Float, // floor | |
93 (SkFunctionParamType) 0, | |
94 (SkFunctionParamType) SkType_Float, // log | |
95 (SkFunctionParamType) 0, | |
96 (SkFunctionParamType) SkType_Array, // max | |
97 (SkFunctionParamType) 0, | |
98 (SkFunctionParamType) SkType_Array, // min | |
99 (SkFunctionParamType) 0, | |
100 (SkFunctionParamType) SkType_Float, // pow | |
101 (SkFunctionParamType) SkType_Float, | |
102 (SkFunctionParamType) 0, | |
103 (SkFunctionParamType) SkType_Float, // random | |
104 (SkFunctionParamType) 0, | |
105 (SkFunctionParamType) SkType_Float, // round | |
106 (SkFunctionParamType) 0, | |
107 (SkFunctionParamType) SkType_Float, // sin | |
108 (SkFunctionParamType) 0, | |
109 (SkFunctionParamType) SkType_Float, // sqrt | |
110 (SkFunctionParamType) 0, | |
111 (SkFunctionParamType) SkType_Float, // tan | |
112 (SkFunctionParamType) 0 | |
113 }; | |
114 | |
115 #if SK_USE_CONDENSED_INFO == 0 | |
116 | |
117 const SkMemberInfo SkDisplayMath::fInfo[] = { | |
118 SK_MEMBER_PROPERTY(E, Float), | |
119 SK_MEMBER_PROPERTY(LN10, Float), | |
120 SK_MEMBER_PROPERTY(LN2, Float), | |
121 SK_MEMBER_PROPERTY(LOG10E, Float), | |
122 SK_MEMBER_PROPERTY(LOG2E, Float), | |
123 SK_MEMBER_PROPERTY(PI, Float), | |
124 SK_MEMBER_PROPERTY(SQRT1_2, Float), | |
125 SK_MEMBER_PROPERTY(SQRT2, Float), | |
126 SK_MEMBER_FUNCTION(abs, Float), | |
127 SK_MEMBER_FUNCTION(acos, Float), | |
128 SK_MEMBER_FUNCTION(asin, Float), | |
129 SK_MEMBER_FUNCTION(atan, Float), | |
130 SK_MEMBER_FUNCTION(atan2, Float), | |
131 SK_MEMBER_FUNCTION(ceil, Float), | |
132 SK_MEMBER_FUNCTION(cos, Float), | |
133 SK_MEMBER_FUNCTION(exp, Float), | |
134 SK_MEMBER_FUNCTION(floor, Float), | |
135 SK_MEMBER_FUNCTION(log, Float), | |
136 SK_MEMBER_FUNCTION(max, Float), | |
137 SK_MEMBER_FUNCTION(min, Float), | |
138 SK_MEMBER_FUNCTION(pow, Float), | |
139 SK_MEMBER_FUNCTION(random, Float), | |
140 SK_MEMBER_FUNCTION(round, Float), | |
141 SK_MEMBER_FUNCTION(sin, Float), | |
142 SK_MEMBER_FUNCTION(sqrt, Float), | |
143 SK_MEMBER_FUNCTION(tan, Float) | |
144 }; | |
145 | |
146 #endif | |
147 | |
148 DEFINE_GET_MEMBER(SkDisplayMath); | |
149 | |
150 void SkDisplayMath::executeFunction(SkDisplayable* target, int index, | |
151 SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, | |
152 SkScriptValue* scriptValue) { | |
153 if (scriptValue == NULL) | |
154 return; | |
155 SkASSERT(target == this); | |
156 SkScriptValue* array = parameters.begin(); | |
157 SkScriptValue* end = parameters.end(); | |
158 SkScalar input = parameters[0].fOperand.fScalar; | |
159 SkScalar scalarResult; | |
160 switch (index) { | |
161 case SK_FUNCTION(abs): | |
162 scalarResult = SkScalarAbs(input); | |
163 break; | |
164 case SK_FUNCTION(acos): | |
165 scalarResult = SkScalarACos(input); | |
166 break; | |
167 case SK_FUNCTION(asin): | |
168 scalarResult = SkScalarASin(input); | |
169 break; | |
170 case SK_FUNCTION(atan): | |
171 scalarResult = SkScalarATan2(input, SK_Scalar1); | |
172 break; | |
173 case SK_FUNCTION(atan2): | |
174 scalarResult = SkScalarATan2(input, parameters[1].fOperand.fScalar); | |
175 break; | |
176 case SK_FUNCTION(ceil): | |
177 scalarResult = SkIntToScalar(SkScalarCeil(input)); | |
178 break; | |
179 case SK_FUNCTION(cos): | |
180 scalarResult = SkScalarCos(input); | |
181 break; | |
182 case SK_FUNCTION(exp): | |
183 scalarResult = SkScalarExp(input); | |
184 break; | |
185 case SK_FUNCTION(floor): | |
186 scalarResult = SkIntToScalar(SkScalarFloor(input)); | |
187 break; | |
188 case SK_FUNCTION(log): | |
189 scalarResult = SkScalarLog(input); | |
190 break; | |
191 case SK_FUNCTION(max): | |
192 scalarResult = -SK_ScalarMax; | |
193 while (array < end) { | |
194 scalarResult = SkMaxScalar(scalarResult, array->fOperand.fScalar
); | |
195 array++; | |
196 } | |
197 break; | |
198 case SK_FUNCTION(min): | |
199 scalarResult = SK_ScalarMax; | |
200 while (array < end) { | |
201 scalarResult = SkMinScalar(scalarResult, array->fOperand.fScalar
); | |
202 array++; | |
203 } | |
204 break; | |
205 case SK_FUNCTION(pow): | |
206 // not the greatest -- but use x^y = e^(y * ln(x)) | |
207 scalarResult = SkScalarLog(input); | |
208 scalarResult = SkScalarMul(parameters[1].fOperand.fScalar, scalarRes
ult); | |
209 scalarResult = SkScalarExp(scalarResult); | |
210 break; | |
211 case SK_FUNCTION(random): | |
212 scalarResult = fRandom.nextUScalar1(); | |
213 break; | |
214 case SK_FUNCTION(round): | |
215 scalarResult = SkIntToScalar(SkScalarRound(input)); | |
216 break; | |
217 case SK_FUNCTION(sin): | |
218 scalarResult = SkScalarSin(input); | |
219 break; | |
220 case SK_FUNCTION(sqrt): { | |
221 SkASSERT(parameters.count() == 1); | |
222 SkASSERT(type == SkType_Float); | |
223 scalarResult = SkScalarSqrt(input); | |
224 } break; | |
225 case SK_FUNCTION(tan): | |
226 scalarResult = SkScalarTan(input); | |
227 break; | |
228 default: | |
229 SkASSERT(0); | |
230 scalarResult = SK_ScalarNaN; | |
231 } | |
232 scriptValue->fOperand.fScalar = scalarResult; | |
233 scriptValue->fType = SkType_Float; | |
234 } | |
235 | |
236 const SkFunctionParamType* SkDisplayMath::getFunctionsParameters() { | |
237 return fFunctionParameters; | |
238 } | |
239 | |
240 bool SkDisplayMath::getProperty(int index, SkScriptValue* value) const { | |
241 if ((unsigned)index < SK_ARRAY_COUNT(gConstants)) { | |
242 value->fOperand.fScalar = gConstants[index]; | |
243 value->fType = SkType_Float; | |
244 return true; | |
245 } | |
246 SkASSERT(0); | |
247 return false; | |
248 } | |
OLD | NEW |