blob: 287ca6e4d4f5ecef491c24953c42271351c23e73 [file] [log] [blame]
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkDisplayTypes.h"
#include "SkAnimateBase.h"
bool SkDisplayDepend::canContainDependents() const {
return true;
}
void SkDisplayDepend::dirty() {
SkDisplayable** last = fDependents.end();
for (SkDisplayable** depPtr = fDependents.begin(); depPtr < last; depPtr++) {
SkAnimateBase* animate = (SkAnimateBase* ) *depPtr;
animate->setChanged(true);
}
}
// Boolean
#if SK_USE_CONDENSED_INFO == 0
const SkMemberInfo SkDisplayBoolean::fInfo[] = {
SK_MEMBER(value, Boolean)
};
#endif
DEFINE_GET_MEMBER(SkDisplayBoolean);
SkDisplayBoolean::SkDisplayBoolean() : value(false) {
}
#ifdef SK_DUMP_ENABLED
void SkDisplayBoolean::dump(SkAnimateMaker* maker){
dumpBase(maker);
SkDebugf("value=\"%s\" />\n", value ? "true" : "false");
}
#endif
// int32_t
#if SK_USE_CONDENSED_INFO == 0
const SkMemberInfo SkDisplayInt::fInfo[] = {
SK_MEMBER(value, Int)
};
#endif
DEFINE_GET_MEMBER(SkDisplayInt);
SkDisplayInt::SkDisplayInt() : value(0) {
}
#ifdef SK_DUMP_ENABLED
void SkDisplayInt::dump(SkAnimateMaker* maker){
dumpBase(maker);
SkDebugf("value=\"%d\" />\n", value);
}
#endif
// SkScalar
#if SK_USE_CONDENSED_INFO == 0
const SkMemberInfo SkDisplayFloat::fInfo[] = {
SK_MEMBER(value, Float)
};
#endif
DEFINE_GET_MEMBER(SkDisplayFloat);
SkDisplayFloat::SkDisplayFloat() : value(0) {
}
#ifdef SK_DUMP_ENABLED
void SkDisplayFloat::dump(SkAnimateMaker* maker) {
dumpBase(maker);
SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value));
}
#endif
// SkString
enum SkDisplayString_Functions {
SK_FUNCTION(slice)
};
enum SkDisplayString_Properties {
SK_PROPERTY(length)
};
const SkFunctionParamType SkDisplayString::fFunctionParameters[] = {
(SkFunctionParamType) SkType_Int, // slice
(SkFunctionParamType) SkType_Int,
(SkFunctionParamType) 0
};
#if SK_USE_CONDENSED_INFO == 0
const SkMemberInfo SkDisplayString::fInfo[] = {
SK_MEMBER_PROPERTY(length, Int),
SK_MEMBER_FUNCTION(slice, String),
SK_MEMBER(value, String)
};
#endif
DEFINE_GET_MEMBER(SkDisplayString);
SkDisplayString::SkDisplayString() {
}
SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) {
}
void SkDisplayString::executeFunction(SkDisplayable* target, int index,
SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type,
SkScriptValue* scriptValue) {
if (scriptValue == NULL)
return;
SkASSERT(target == this);
switch (index) {
case SK_FUNCTION(slice):
scriptValue->fType = SkType_String;
SkASSERT(parameters[0].fType == SkType_Int);
int start = parameters[0].fOperand.fS32;
if (start < 0)
start = (int) (value.size() - start);
int end = (int) value.size();
if (parameters.count() > 1) {
SkASSERT(parameters[1].fType == SkType_Int);
end = parameters[1].fOperand.fS32;
}
//if (end >= 0 && end < (int) value.size())
if (end >= 0 && end <= (int) value.size())
scriptValue->fOperand.fString = new SkString(&value.c_str()[start], end - start);
else
scriptValue->fOperand.fString = new SkString(value);
break;
}
}
const SkFunctionParamType* SkDisplayString::getFunctionsParameters() {
return fFunctionParameters;
}
bool SkDisplayString::getProperty(int index, SkScriptValue* scriptValue) const {
switch (index) {
case SK_PROPERTY(length):
scriptValue->fType = SkType_Int;
scriptValue->fOperand.fS32 = (int32_t) value.size();
break;
default:
SkASSERT(0);
return false;
}
return true;
}
// SkArray
#if 0 // !!! reason enough to qualify enum with class name or move typedArray into its own file
enum SkDisplayArray_Properties {
SK_PROPERTY(length)
};
#endif
#if SK_USE_CONDENSED_INFO == 0
const SkMemberInfo SkDisplayArray::fInfo[] = {
SK_MEMBER_PROPERTY(length, Int),
SK_MEMBER_ARRAY(values, Unknown)
};
#endif
DEFINE_GET_MEMBER(SkDisplayArray);
SkDisplayArray::SkDisplayArray() {
}
SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) {
}
SkDisplayArray::~SkDisplayArray() {
if (values.getType() == SkType_String) {
for (int index = 0; index < values.count(); index++)
delete values[index].fString;
return;
}
if (values.getType() == SkType_Array) {
for (int index = 0; index < values.count(); index++)
delete values[index].fArray;
}
}
bool SkDisplayArray::getProperty(int index, SkScriptValue* value) const {
switch (index) {
case SK_PROPERTY(length):
value->fType = SkType_Int;
value->fOperand.fS32 = values.count();
break;
default:
SkASSERT(0);
return false;
}
return true;
}