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