1/* libs/graphics/animator/SkDisplayTypes.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 "SkDisplayTypes.h"
19#include "SkAnimateBase.h"
20
21bool SkDisplayDepend::canContainDependents() const {
22    return true;
23}
24
25void SkDisplayDepend::dirty() {
26    SkDisplayable** last = fDependents.end();
27    for (SkDisplayable** depPtr = fDependents.begin(); depPtr < last; depPtr++) {
28        SkAnimateBase* animate = (SkAnimateBase* ) *depPtr;
29        animate->setChanged(true);
30    }
31}
32
33// Boolean
34#if SK_USE_CONDENSED_INFO == 0
35
36const SkMemberInfo SkDisplayBoolean::fInfo[] = {
37    SK_MEMBER(value, Boolean)
38};
39
40#endif
41
42DEFINE_GET_MEMBER(SkDisplayBoolean);
43
44SkDisplayBoolean::SkDisplayBoolean() : value(false) {
45}
46
47#ifdef SK_DUMP_ENABLED
48void SkDisplayBoolean::dump(SkAnimateMaker* maker){
49    dumpBase(maker);
50    SkDebugf("value=\"%s\" />\n", value ? "true" : "false");
51}
52#endif
53
54// int32_t
55#if SK_USE_CONDENSED_INFO == 0
56
57const SkMemberInfo SkDisplayInt::fInfo[] = {
58    SK_MEMBER(value, Int)
59};
60
61#endif
62
63DEFINE_GET_MEMBER(SkDisplayInt);
64
65SkDisplayInt::SkDisplayInt() : value(0) {
66}
67
68#ifdef SK_DUMP_ENABLED
69void SkDisplayInt::dump(SkAnimateMaker* maker){
70    dumpBase(maker);
71    SkDebugf("value=\"%d\" />\n", value);
72}
73#endif
74
75// SkScalar
76#if SK_USE_CONDENSED_INFO == 0
77
78const SkMemberInfo SkDisplayFloat::fInfo[] = {
79    SK_MEMBER(value, Float)
80};
81
82#endif
83
84DEFINE_GET_MEMBER(SkDisplayFloat);
85
86SkDisplayFloat::SkDisplayFloat() : value(0) {
87}
88
89#ifdef SK_DUMP_ENABLED
90void SkDisplayFloat::dump(SkAnimateMaker* maker) {
91    dumpBase(maker);
92#ifdef SK_CAN_USE_FLOAT
93    SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value));
94#else
95    SkDebugf("value=\"%x\" />\n", value);
96#endif
97}
98#endif
99
100// SkString
101enum SkDisplayString_Functions {
102    SK_FUNCTION(slice)
103};
104
105enum SkDisplayString_Properties {
106    SK_PROPERTY(length)
107};
108
109const SkFunctionParamType SkDisplayString::fFunctionParameters[] = {
110    (SkFunctionParamType) SkType_Int,   // slice
111    (SkFunctionParamType) SkType_Int,
112    (SkFunctionParamType) 0
113};
114
115#if SK_USE_CONDENSED_INFO == 0
116
117const SkMemberInfo SkDisplayString::fInfo[] = {
118    SK_MEMBER_PROPERTY(length, Int),
119    SK_MEMBER_FUNCTION(slice, String),
120    SK_MEMBER(value, String)
121};
122
123#endif
124
125DEFINE_GET_MEMBER(SkDisplayString);
126
127SkDisplayString::SkDisplayString() {
128}
129
130SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) {
131}
132
133void SkDisplayString::executeFunction(SkDisplayable* target, int index,
134        SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type,
135        SkScriptValue* scriptValue) {
136    if (scriptValue == NULL)
137        return;
138    SkASSERT(target == this);
139    switch (index) {
140        case SK_FUNCTION(slice):
141            scriptValue->fType = SkType_String;
142            SkASSERT(parameters[0].fType == SkType_Int);
143            int start =  parameters[0].fOperand.fS32;
144            if (start < 0)
145                start = (int) (value.size() - start);
146            int end = (int) value.size();
147            if (parameters.count() > 1) {
148                SkASSERT(parameters[1].fType == SkType_Int);
149                end = parameters[1].fOperand.fS32;
150            }
151            //if (end >= 0 && end < (int) value.size())
152            if (end >= 0 && end <= (int) value.size())
153                scriptValue->fOperand.fString = new SkString(&value.c_str()[start], end - start);
154            else
155                scriptValue->fOperand.fString = new SkString(value);
156        break;
157    }
158}
159
160const SkFunctionParamType* SkDisplayString::getFunctionsParameters() {
161    return fFunctionParameters;
162}
163
164bool SkDisplayString::getProperty(int index, SkScriptValue* scriptValue) const {
165    switch (index) {
166        case SK_PROPERTY(length):
167            scriptValue->fType = SkType_Int;
168            scriptValue->fOperand.fS32 = (int32_t) value.size();
169            break;
170        default:
171            SkASSERT(0);
172            return false;
173    }
174    return true;
175}
176
177
178// SkArray
179#if 0   // !!! reason enough to qualify enum with class name or move typedArray into its own file
180enum SkDisplayArray_Properties {
181    SK_PROPERTY(length)
182};
183#endif
184
185#if SK_USE_CONDENSED_INFO == 0
186
187const SkMemberInfo SkDisplayArray::fInfo[] = {
188    SK_MEMBER_PROPERTY(length, Int),
189    SK_MEMBER_ARRAY(values, Unknown)
190};
191
192#endif
193
194DEFINE_GET_MEMBER(SkDisplayArray);
195
196SkDisplayArray::SkDisplayArray() {
197}
198
199SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) {
200
201}
202
203SkDisplayArray::~SkDisplayArray() {
204    if (values.getType() == SkType_String) {
205        for (int index = 0; index < values.count(); index++)
206            delete values[index].fString;
207        return;
208    }
209    if (values.getType() == SkType_Array) {
210        for (int index = 0; index < values.count(); index++)
211            delete values[index].fArray;
212    }
213}
214
215bool SkDisplayArray::getProperty(int index, SkScriptValue* value) const {
216    switch (index) {
217        case SK_PROPERTY(length):
218            value->fType = SkType_Int;
219            value->fOperand.fS32 = values.count();
220            break;
221        default:
222            SkASSERT(0);
223            return false;
224    }
225    return true;
226}
227
228
229
230