| 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 |