1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkDisplayMath.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,229 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkDisplayMath.h" 1.14 + 1.15 +enum SkDisplayMath_Properties { 1.16 + SK_PROPERTY(E), 1.17 + SK_PROPERTY(LN10), 1.18 + SK_PROPERTY(LN2), 1.19 + SK_PROPERTY(LOG10E), 1.20 + SK_PROPERTY(LOG2E), 1.21 + SK_PROPERTY(PI), 1.22 + SK_PROPERTY(SQRT1_2), 1.23 + SK_PROPERTY(SQRT2) 1.24 +}; 1.25 + 1.26 +const SkScalar SkDisplayMath::gConstants[] = { 1.27 + 2.718281828f, // E 1.28 + 2.302585093f, // LN10 1.29 + 0.693147181f, // LN2 1.30 + 0.434294482f, // LOG10E 1.31 + 1.442695041f, // LOG2E 1.32 + 3.141592654f, // PI 1.33 + 0.707106781f, // SQRT1_2 1.34 + 1.414213562f // SQRT2 1.35 +}; 1.36 + 1.37 +enum SkDisplayMath_Functions { 1.38 + SK_FUNCTION(abs), 1.39 + SK_FUNCTION(acos), 1.40 + SK_FUNCTION(asin), 1.41 + SK_FUNCTION(atan), 1.42 + SK_FUNCTION(atan2), 1.43 + SK_FUNCTION(ceil), 1.44 + SK_FUNCTION(cos), 1.45 + SK_FUNCTION(exp), 1.46 + SK_FUNCTION(floor), 1.47 + SK_FUNCTION(log), 1.48 + SK_FUNCTION(max), 1.49 + SK_FUNCTION(min), 1.50 + SK_FUNCTION(pow), 1.51 + SK_FUNCTION(random), 1.52 + SK_FUNCTION(round), 1.53 + SK_FUNCTION(sin), 1.54 + SK_FUNCTION(sqrt), 1.55 + SK_FUNCTION(tan) 1.56 +}; 1.57 + 1.58 +const SkFunctionParamType SkDisplayMath::fFunctionParameters[] = { 1.59 + (SkFunctionParamType) SkType_Float, // abs 1.60 + (SkFunctionParamType) 0, 1.61 + (SkFunctionParamType) SkType_Float, // acos 1.62 + (SkFunctionParamType) 0, 1.63 + (SkFunctionParamType) SkType_Float, // asin 1.64 + (SkFunctionParamType) 0, 1.65 + (SkFunctionParamType) SkType_Float, // atan 1.66 + (SkFunctionParamType) 0, 1.67 + (SkFunctionParamType) SkType_Float, // atan2 1.68 + (SkFunctionParamType) SkType_Float, 1.69 + (SkFunctionParamType) 0, 1.70 + (SkFunctionParamType) SkType_Float, // ceil 1.71 + (SkFunctionParamType) 0, 1.72 + (SkFunctionParamType) SkType_Float, // cos 1.73 + (SkFunctionParamType) 0, 1.74 + (SkFunctionParamType) SkType_Float, // exp 1.75 + (SkFunctionParamType) 0, 1.76 + (SkFunctionParamType) SkType_Float, // floor 1.77 + (SkFunctionParamType) 0, 1.78 + (SkFunctionParamType) SkType_Float, // log 1.79 + (SkFunctionParamType) 0, 1.80 + (SkFunctionParamType) SkType_Array, // max 1.81 + (SkFunctionParamType) 0, 1.82 + (SkFunctionParamType) SkType_Array, // min 1.83 + (SkFunctionParamType) 0, 1.84 + (SkFunctionParamType) SkType_Float, // pow 1.85 + (SkFunctionParamType) SkType_Float, 1.86 + (SkFunctionParamType) 0, 1.87 + (SkFunctionParamType) SkType_Float, // random 1.88 + (SkFunctionParamType) 0, 1.89 + (SkFunctionParamType) SkType_Float, // round 1.90 + (SkFunctionParamType) 0, 1.91 + (SkFunctionParamType) SkType_Float, // sin 1.92 + (SkFunctionParamType) 0, 1.93 + (SkFunctionParamType) SkType_Float, // sqrt 1.94 + (SkFunctionParamType) 0, 1.95 + (SkFunctionParamType) SkType_Float, // tan 1.96 + (SkFunctionParamType) 0 1.97 +}; 1.98 + 1.99 +#if SK_USE_CONDENSED_INFO == 0 1.100 + 1.101 +const SkMemberInfo SkDisplayMath::fInfo[] = { 1.102 + SK_MEMBER_PROPERTY(E, Float), 1.103 + SK_MEMBER_PROPERTY(LN10, Float), 1.104 + SK_MEMBER_PROPERTY(LN2, Float), 1.105 + SK_MEMBER_PROPERTY(LOG10E, Float), 1.106 + SK_MEMBER_PROPERTY(LOG2E, Float), 1.107 + SK_MEMBER_PROPERTY(PI, Float), 1.108 + SK_MEMBER_PROPERTY(SQRT1_2, Float), 1.109 + SK_MEMBER_PROPERTY(SQRT2, Float), 1.110 + SK_MEMBER_FUNCTION(abs, Float), 1.111 + SK_MEMBER_FUNCTION(acos, Float), 1.112 + SK_MEMBER_FUNCTION(asin, Float), 1.113 + SK_MEMBER_FUNCTION(atan, Float), 1.114 + SK_MEMBER_FUNCTION(atan2, Float), 1.115 + SK_MEMBER_FUNCTION(ceil, Float), 1.116 + SK_MEMBER_FUNCTION(cos, Float), 1.117 + SK_MEMBER_FUNCTION(exp, Float), 1.118 + SK_MEMBER_FUNCTION(floor, Float), 1.119 + SK_MEMBER_FUNCTION(log, Float), 1.120 + SK_MEMBER_FUNCTION(max, Float), 1.121 + SK_MEMBER_FUNCTION(min, Float), 1.122 + SK_MEMBER_FUNCTION(pow, Float), 1.123 + SK_MEMBER_FUNCTION(random, Float), 1.124 + SK_MEMBER_FUNCTION(round, Float), 1.125 + SK_MEMBER_FUNCTION(sin, Float), 1.126 + SK_MEMBER_FUNCTION(sqrt, Float), 1.127 + SK_MEMBER_FUNCTION(tan, Float) 1.128 +}; 1.129 + 1.130 +#endif 1.131 + 1.132 +DEFINE_GET_MEMBER(SkDisplayMath); 1.133 + 1.134 +void SkDisplayMath::executeFunction(SkDisplayable* target, int index, 1.135 + SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, 1.136 + SkScriptValue* scriptValue) { 1.137 + if (scriptValue == NULL) 1.138 + return; 1.139 + SkASSERT(target == this); 1.140 + SkScriptValue* array = parameters.begin(); 1.141 + SkScriptValue* end = parameters.end(); 1.142 + SkScalar input = parameters[0].fOperand.fScalar; 1.143 + SkScalar scalarResult; 1.144 + switch (index) { 1.145 + case SK_FUNCTION(abs): 1.146 + scalarResult = SkScalarAbs(input); 1.147 + break; 1.148 + case SK_FUNCTION(acos): 1.149 + scalarResult = SkScalarACos(input); 1.150 + break; 1.151 + case SK_FUNCTION(asin): 1.152 + scalarResult = SkScalarASin(input); 1.153 + break; 1.154 + case SK_FUNCTION(atan): 1.155 + scalarResult = SkScalarATan2(input, SK_Scalar1); 1.156 + break; 1.157 + case SK_FUNCTION(atan2): 1.158 + scalarResult = SkScalarATan2(input, parameters[1].fOperand.fScalar); 1.159 + break; 1.160 + case SK_FUNCTION(ceil): 1.161 + scalarResult = SkScalarCeilToScalar(input); 1.162 + break; 1.163 + case SK_FUNCTION(cos): 1.164 + scalarResult = SkScalarCos(input); 1.165 + break; 1.166 + case SK_FUNCTION(exp): 1.167 + scalarResult = SkScalarExp(input); 1.168 + break; 1.169 + case SK_FUNCTION(floor): 1.170 + scalarResult = SkScalarFloorToScalar(input); 1.171 + break; 1.172 + case SK_FUNCTION(log): 1.173 + scalarResult = SkScalarLog(input); 1.174 + break; 1.175 + case SK_FUNCTION(max): 1.176 + scalarResult = -SK_ScalarMax; 1.177 + while (array < end) { 1.178 + scalarResult = SkMaxScalar(scalarResult, array->fOperand.fScalar); 1.179 + array++; 1.180 + } 1.181 + break; 1.182 + case SK_FUNCTION(min): 1.183 + scalarResult = SK_ScalarMax; 1.184 + while (array < end) { 1.185 + scalarResult = SkMinScalar(scalarResult, array->fOperand.fScalar); 1.186 + array++; 1.187 + } 1.188 + break; 1.189 + case SK_FUNCTION(pow): 1.190 + // not the greatest -- but use x^y = e^(y * ln(x)) 1.191 + scalarResult = SkScalarLog(input); 1.192 + scalarResult = SkScalarMul(parameters[1].fOperand.fScalar, scalarResult); 1.193 + scalarResult = SkScalarExp(scalarResult); 1.194 + break; 1.195 + case SK_FUNCTION(random): 1.196 + scalarResult = fRandom.nextUScalar1(); 1.197 + break; 1.198 + case SK_FUNCTION(round): 1.199 + scalarResult = SkScalarRoundToScalar(input); 1.200 + break; 1.201 + case SK_FUNCTION(sin): 1.202 + scalarResult = SkScalarSin(input); 1.203 + break; 1.204 + case SK_FUNCTION(sqrt): { 1.205 + SkASSERT(parameters.count() == 1); 1.206 + SkASSERT(type == SkType_Float); 1.207 + scalarResult = SkScalarSqrt(input); 1.208 + } break; 1.209 + case SK_FUNCTION(tan): 1.210 + scalarResult = SkScalarTan(input); 1.211 + break; 1.212 + default: 1.213 + SkASSERT(0); 1.214 + scalarResult = SK_ScalarNaN; 1.215 + } 1.216 + scriptValue->fOperand.fScalar = scalarResult; 1.217 + scriptValue->fType = SkType_Float; 1.218 +} 1.219 + 1.220 +const SkFunctionParamType* SkDisplayMath::getFunctionsParameters() { 1.221 + return fFunctionParameters; 1.222 +} 1.223 + 1.224 +bool SkDisplayMath::getProperty(int index, SkScriptValue* value) const { 1.225 + if ((unsigned)index < SK_ARRAY_COUNT(gConstants)) { 1.226 + value->fOperand.fScalar = gConstants[index]; 1.227 + value->fType = SkType_Float; 1.228 + return true; 1.229 + } 1.230 + SkASSERT(0); 1.231 + return false; 1.232 +}