gfx/skia/trunk/src/animator/SkDisplayMath.cpp

changeset 0
6474c204b198
     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 +}

mercurial