/* * 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& parameters, SkDisplayTypes type, SkScriptValue* scriptValue) { if (scriptValue == nullptr) 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; }