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
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);
84    SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value));
85}
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