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