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