blob: d3bfa101aa84e070a6f2c0182a9a43fd6353565f [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#include "SkDisplayTypes.h"
11#include "SkAnimateBase.h"
12
13bool SkDisplayDepend::canContainDependents() const {
14 return true;
15}
16
17void 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
28const SkMemberInfo SkDisplayBoolean::fInfo[] = {
29 SK_MEMBER(value, Boolean)
30};
31
32#endif
33
34DEFINE_GET_MEMBER(SkDisplayBoolean);
35
36SkDisplayBoolean::SkDisplayBoolean() : value(false) {
37}
38
39#ifdef SK_DUMP_ENABLED
40void 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
49const SkMemberInfo SkDisplayInt::fInfo[] = {
50 SK_MEMBER(value, Int)
51};
52
53#endif
54
55DEFINE_GET_MEMBER(SkDisplayInt);
56
57SkDisplayInt::SkDisplayInt() : value(0) {
58}
59
60#ifdef SK_DUMP_ENABLED
61void 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
70const SkMemberInfo SkDisplayFloat::fInfo[] = {
71 SK_MEMBER(value, Float)
72};
73
74#endif
75
76DEFINE_GET_MEMBER(SkDisplayFloat);
77
78SkDisplayFloat::SkDisplayFloat() : value(0) {
79}
80
81#ifdef SK_DUMP_ENABLED
82void SkDisplayFloat::dump(SkAnimateMaker* maker) {
83 dumpBase(maker);
reed@android.com8a1c16f2008-12-17 15:59:43 +000084 SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value));
reed@android.com8a1c16f2008-12-17 15:59:43 +000085}
86#endif
87
88// SkString
89enum SkDisplayString_Functions {
90 SK_FUNCTION(slice)
91};
92
93enum SkDisplayString_Properties {
94 SK_PROPERTY(length)
95};
96
97const 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
105const 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
113DEFINE_GET_MEMBER(SkDisplayString);
114
115SkDisplayString::SkDisplayString() {
116}
117
118SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) {
119}
120
121void SkDisplayString::executeFunction(SkDisplayable* target, int index,
122 SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type,
123 SkScriptValue* scriptValue) {
124 if (scriptValue == NULL)
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
148const SkFunctionParamType* SkDisplayString::getFunctionsParameters() {
149 return fFunctionParameters;
150}
151
152bool 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
168enum SkDisplayArray_Properties {
169 SK_PROPERTY(length)
170};
171#endif
172
173#if SK_USE_CONDENSED_INFO == 0
174
175const SkMemberInfo SkDisplayArray::fInfo[] = {
176 SK_MEMBER_PROPERTY(length, Int),
177 SK_MEMBER_ARRAY(values, Unknown)
178};
179
180#endif
181
182DEFINE_GET_MEMBER(SkDisplayArray);
183
184SkDisplayArray::SkDisplayArray() {
185}
186
187SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) {
188
189}
190
191SkDisplayArray::~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
203bool 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
216
217