• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
canContainDependents() const21 bool SkDisplayDepend::canContainDependents() const {
22     return true;
23 }
24 
dirty()25 void 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 
36 const SkMemberInfo SkDisplayBoolean::fInfo[] = {
37     SK_MEMBER(value, Boolean)
38 };
39 
40 #endif
41 
42 DEFINE_GET_MEMBER(SkDisplayBoolean);
43 
SkDisplayBoolean()44 SkDisplayBoolean::SkDisplayBoolean() : value(false) {
45 }
46 
47 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)48 void 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 
57 const SkMemberInfo SkDisplayInt::fInfo[] = {
58     SK_MEMBER(value, Int)
59 };
60 
61 #endif
62 
63 DEFINE_GET_MEMBER(SkDisplayInt);
64 
SkDisplayInt()65 SkDisplayInt::SkDisplayInt() : value(0) {
66 }
67 
68 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)69 void 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 
78 const SkMemberInfo SkDisplayFloat::fInfo[] = {
79     SK_MEMBER(value, Float)
80 };
81 
82 #endif
83 
84 DEFINE_GET_MEMBER(SkDisplayFloat);
85 
SkDisplayFloat()86 SkDisplayFloat::SkDisplayFloat() : value(0) {
87 }
88 
89 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)90 void 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
101 enum SkDisplayString_Functions {
102     SK_FUNCTION(slice)
103 };
104 
105 enum SkDisplayString_Properties {
106     SK_PROPERTY(length)
107 };
108 
109 const 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 
117 const 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 
125 DEFINE_GET_MEMBER(SkDisplayString);
126 
SkDisplayString()127 SkDisplayString::SkDisplayString() {
128 }
129 
SkDisplayString(SkString & copyFrom)130 SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) {
131 }
132 
executeFunction(SkDisplayable * target,int index,SkTDArray<SkScriptValue> & parameters,SkDisplayTypes type,SkScriptValue * scriptValue)133 void 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 
getFunctionsParameters()160 const SkFunctionParamType* SkDisplayString::getFunctionsParameters() {
161     return fFunctionParameters;
162 }
163 
getProperty(int index,SkScriptValue * scriptValue) const164 bool 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
180 enum SkDisplayArray_Properties {
181     SK_PROPERTY(length)
182 };
183 #endif
184 
185 #if SK_USE_CONDENSED_INFO == 0
186 
187 const SkMemberInfo SkDisplayArray::fInfo[] = {
188     SK_MEMBER_PROPERTY(length, Int),
189     SK_MEMBER_ARRAY(values, Unknown)
190 };
191 
192 #endif
193 
194 DEFINE_GET_MEMBER(SkDisplayArray);
195 
SkDisplayArray()196 SkDisplayArray::SkDisplayArray() {
197 }
198 
SkDisplayArray(SkTypedArray & copyFrom)199 SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) {
200 
201 }
202 
~SkDisplayArray()203 SkDisplayArray::~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 
getProperty(int index,SkScriptValue * value) const215 bool 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