blob: b5bc573111485da4ac29114a6324a6ad05f6a76d [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/* 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