180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayable.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayApply.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkParse.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayList.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayTypes.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_FIND_LEAKS
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// int SkDisplayable::fAllocationCount;
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkTDDisplayableArray SkDisplayable::fAllocations;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable::SkDisplayable() {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    id = _id.c_str();
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_FIND_LEAKS
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // fAllocationCount++;
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *fAllocations.append() = this;
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable::~SkDisplayable() {
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_FIND_LEAKS
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //  fAllocationCount--;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = fAllocations.find(this);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(index >= 0);
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAllocations.remove(index);
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool SkDisplayable::addChild(SkAnimateMaker& , SkDisplayable* child) {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//void SkDisplayable::apply(SkAnimateMaker& , const SkMemberInfo* ,
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//      SkDisplayable* , SkScalar [], int count) {
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  SkASSERT(0);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//}
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::canContainDependents() const {
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::childrenNeedDisposing() const {
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::clearBounder() {
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::contains(SkDisplayable* ) {
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable* SkDisplayable::contains(const SkString& ) {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable* SkDisplayable::deepCopy(SkAnimateMaker* maker) {
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayTypes type = getType();
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (type == SkType_Unknown) {
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(0);
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return NULL;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayable* copy = SkDisplayType::CreateInstance(maker, type);
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = -1;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int propIndex = 0;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMemberInfo* info;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    do {
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info = copy->getMember(++index);
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info == NULL)
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_MemberProperty) {
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkScriptValue value;
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (getProperty(propIndex, &value))
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                copy->setProperty(propIndex, value);
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            propIndex++;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_MemberFunction)
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_Array) {
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this);
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int arrayCount;
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (array == NULL || (arrayCount = array->count()) == 0)
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                continue;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkTDOperandArray* copyArray = (SkTDOperandArray*) info->memberData(copy);
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            copyArray->setCount(arrayCount);
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayTypes elementType;
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (type == SkType_Array) {
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDisplayArray* dispArray = (SkDisplayArray*) this;
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                elementType = dispArray->values.getType();
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } else
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                elementType = info->arrayType();
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            size_t elementSize = SkMemberInfo::GetSize(elementType);
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            size_t byteSize = elementSize * arrayCount;
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            memcpy(copyArray->begin(), array->begin(), byteSize);
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayable** displayable = (SkDisplayable**) info->memberData(this);
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (*displayable == NULL || *displayable == (SkDisplayable*) -1)
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                continue;
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayable* deeper = (*displayable)->deepCopy(maker);
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            info->setMemberData(copy, deeper, sizeof(deeper));
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_String || info->fType == SkType_DynamicString) {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkString* string;
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            info->getString(this, &string);
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            info->setString(copy, string);
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void* data = info->memberData(this);
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        size_t size = SkMemberInfo::GetSize(info->fType);
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info->setMemberData(copy, data, size);
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } while (true);
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    copy->dirty();
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return copy;
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dirty() {
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dump(SkAnimateMaker* maker) {
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dumpBase(maker);
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_USE_CONDENSED_INFO == 0
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dumpAttrs(maker);
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dumpChildren(maker);
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpAttrs(SkAnimateMaker* maker) {
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayTypes type = getType();
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (type == SkType_Unknown) {
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //SkDebugf("/>\n");
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayable* blankCopy = SkDisplayType::CreateInstance(maker, type);
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = -1;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int propIndex = 0;
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMemberInfo* info;
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMemberInfo* blankInfo;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScriptValue value;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScriptValue blankValue;
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkOperand values[2];
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkOperand blankValues[2];
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    do {
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info = this->getMember(++index);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (NULL == info) {
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            //SkDebugf("\n");
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkType_MemberProperty == info->fType) {
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (getProperty(propIndex, &value)) {
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                blankCopy->getProperty(propIndex, &blankValue);
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                //last two are dummies
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                dumpValues(info, value.fType, value.fOperand, blankValue.fOperand, value.fOperand, blankValue.fOperand);
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                }
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            propIndex++;
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_MemberFunction)
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_Array) {
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this);
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int arrayCount;
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (array == NULL || (arrayCount = array->count()) == 0)
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                continue;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayTypes elementType;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (type == SkType_Array) {
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDisplayArray* dispArray = (SkDisplayArray*) this;
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                elementType = dispArray->values.getType();
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } else
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                elementType = info->arrayType();
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            bool firstElem = true;
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"[", info->fName);
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (SkOperand* op = array->begin(); op < array->end(); op++) {
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                if (!firstElem) SkDebugf(",");
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                switch (elementType) {
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        case SkType_Displayable:
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            SkDebugf("%s", op->fDisplayable->id);
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            break;
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        case SkType_Int:
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            SkDebugf("%d", op->fS32);
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            break;
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        case SkType_Float:
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            SkDebugf("%g", SkScalarToFloat(op->fScalar));
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            break;
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        case SkType_String:
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        case SkType_DynamicString:
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            SkDebugf("%s", op->fString->c_str());
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            break;
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        default:
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            break;
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                }
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                firstElem = false;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("]\" ");
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (info->fType == SkType_String || info->fType == SkType_DynamicString) {
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkString* string;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            info->getString(this, &string);
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (string->isEmpty() == false)
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\"\t", info->fName, string->c_str());
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        blankInfo = blankCopy->getMember(index);
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int i = info->fCount;
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info->getValue(this, values, i);
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        blankInfo->getValue(blankCopy, blankValues, i);
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dumpValues(info, info->fType, values[0], blankValues[0], values[1], blankValues[1]);
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } while (true);
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    delete blankCopy;
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpBase(SkAnimateMaker* maker) {
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayTypes type = getType();
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* elementName = "(unknown)";
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (type != SkType_Unknown && type != SkType_Screenplay)
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        elementName = SkDisplayType::GetName(maker, type);
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("%*s", SkDisplayList::fIndent, "");
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (SkDisplayList::fDumpIndex != 0 && SkDisplayList::fIndent == 0)
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("%d: ", SkDisplayList::fDumpIndex);
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("<%s ", elementName);
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (strcmp(id,"") != 0)
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("id=\"%s\" ", id);
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpChildren(SkAnimateMaker* maker, bool closedAngle) {
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = -1;
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMemberInfo* info;
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    index = -1;
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayList::fIndent += 4;
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    do {
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        info = this->getMember(++index);
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (NULL == info) {
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayable** displayable = (SkDisplayable**) info->memberData(this);
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (*displayable == NULL || *displayable == (SkDisplayable*) -1)
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                continue;
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (closedAngle == false) {
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf(">\n");
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                closedAngle = true;
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            (*displayable)->dump(maker);
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } while (true);
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayList::fIndent -= 4;
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (closedAngle)
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dumpEnd(maker);
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    else
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("/>\n");
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpEnd(SkAnimateMaker* maker) {
28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayTypes type = getType();
28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* elementName = "(unknown)";
28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (type != SkType_Unknown && type != SkType_Screenplay)
28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        elementName = SkDisplayType::GetName(maker, type);
28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("%*s", SkDisplayList::fIndent, "");
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("</%s>\n", elementName);
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpEvents() {
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::dumpValues(const SkMemberInfo* info, SkDisplayTypes type, SkOperand op, SkOperand blankOp,
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkOperand op2, SkOperand blankOp2) {
29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (type) {
29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_BitmapEncoding:
29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        switch (op.fS32) {
30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 0 : SkDebugf("type=\"jpeg\" ");
30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 1 : SkDebugf("type=\"png\" ");
30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            default: SkDebugf("type=\"UNDEFINED\" ");
30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //should make this a separate case in dump attrs, rather than make dump values have a larger signature
30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_Point:
30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fScalar != blankOp.fScalar || op2.fScalar != blankOp.fScalar) {
31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"[%g,%g]\" ", info->fName, SkScalarToFloat(op.fScalar), SkScalarToFloat(op2.fScalar));
31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_FromPathMode:
31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        switch (op.fS32) {
31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 0:
31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                //don't want to print anything for 0, just adding it to remove it from default:
31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 1:
31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\" ", info->fName, "angle");
32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 2:
32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\" ", info->fName, "position");
32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            default:
32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"INVALID\" ", info->fName);
32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_MaskFilterBlurStyle:
32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        switch (op.fS32) {
33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 0:
33180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
33280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 1:
33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\" ", info->fName, "solid");
33480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
33580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 2:
33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\" ", info->fName, "outer");
33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case 3:
33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"%s\" ", info->fName, "inner");
34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            default:
34280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("%s=\"INVALID\" ", info->fName);
34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_FilterType:
34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fS32 == 1)
34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"%s\" ", info->fName, "bilinear");
34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_PathDirection:
35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "cw" : "ccw");
35180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
35280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_FillType:
35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "winding" : "evenOdd");
35480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_TileMode:
35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //correct to look at the S32?
35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fS32 != blankOp.fS32)
35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "clamp" : op.fS32 == 1 ? "repeat" : "mirror");
35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
36080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_Boolean:
36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fS32 != blankOp.fS32)
36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "false" : "true");
36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
36480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_Int:
36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fS32 != blankOp.fS32)
36680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf(" %s=\"%d\"  ", info->fName, op.fS32);
36780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_Float:
36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fScalar != blankOp.fScalar) { //or /65536?
37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"%g\"  ", info->fName, SkScalarToFloat(op.fScalar));
37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
37380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_String:
37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_DynamicString:
37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fString->size() > 0)
37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s=\"%s\" ", info->fName, op.fString->c_str());
37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case SkType_MSec:
37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (op.fS32 != blankOp.fS32) {
38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf(" %s=\"%g\"  ", info->fName, SkScalarToFloat(SkScalarDiv(op.fS32, 1000)));
38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    default:
38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("");
38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::enable( SkAnimateMaker& ) {
39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
39280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
39380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::enableBounder() {
39480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::executeFunction(SkDisplayable* , int index,
39780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkTDArray<SkScriptValue>& , SkDisplayTypes, SkScriptValue*  ) {
39880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(0);
39980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::executeFunction(SkDisplayable* target,
40280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkMemberInfo* info, SkTypedArray* values, SkScriptValue* value) {
40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<SkScriptValue> typedValues;
40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (SkOperand* op = values->begin(); op < values->end(); op++) {
40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScriptValue temp;
40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        temp.fType = values->getType();
40780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        temp.fOperand = *op;
40880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        *typedValues.append() = temp;
40980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
41080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    executeFunction(target, info->functionIndex(), typedValues, info->getType(), value);
41180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
41280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
41380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::executeFunction2(SkDisplayable* , int index,
41480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkOpArray* params, SkDisplayTypes, SkOperand2*  ) {
41580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(0);
41680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
41780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
41880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::getBounds(SkRect* rect) {
41980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(rect);
42080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    rect->fLeft = rect->fTop = SK_ScalarMax;
42180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    rect->fRight= rect->fBottom = -SK_ScalarMax;
42280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
42380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
42480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkFunctionParamType* SkDisplayable::getFunctionsParameters() {
42580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
42680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
42780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
42880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo* SkDisplayable::getMember(int index) {
42980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
43080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
43180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
43280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo* SkDisplayable::getMember(const char name[]) {
43380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
43480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
43580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
43680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkFunctionParamType* SkDisplayable::getParameters(const SkMemberInfo* info,
43780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        int* paramCount) {
43880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkFunctionParamType* params = getFunctionsParameters();
43980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(params != NULL);
44080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int funcIndex = info->functionIndex();
44180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // !!! eventually break traversing params into an external function (maybe this whole function)
44280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = funcIndex;
44380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int offset = 0;
44480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    while (--index >= 0) {
44580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        while (params[offset] != 0)
44680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            offset++;
44780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        offset++;
44880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
44980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int count = 0;
45080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    while (params[offset] != 0) {
45180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        count++;
45280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        offset++;
45380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
45480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *paramCount = count;
45580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return &params[offset - count];
45680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
45780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
45880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable* SkDisplayable::getParent() const {
45980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
46080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
46180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
46280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::getProperty(int index, SkScriptValue* ) const {
46380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  SkASSERT(0);
46480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
46580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
46680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
46780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::getProperty2(int index, SkOperand2* value) const {
46880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(0);
46980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
47080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
47180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
47280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayTypes SkDisplayable::getType() const {
47380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkType_Unknown;
47480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
47580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
47680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::hasEnable() const {
47780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
47880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
47980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
48080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::isDrawable() const {
48180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
48280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
48380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
48480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::onEndElement(SkAnimateMaker& ) {}
48580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
48680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo* SkDisplayable::preferredChild(SkDisplayTypes type) {
48780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
48880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
48980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
49080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::resolveIDs(SkAnimateMaker& maker, SkDisplayable* original, SkApply* apply) {
49180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
49280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
49380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
49480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//SkDisplayable* SkDisplayable::resolveTarget(SkAnimateMaker& ) {
49580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  return this;
49680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//}
49780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
49880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::setChildHasID() {
49980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
50080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
50180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::setParent(SkDisplayable* ) {
50280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
50380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
50480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
50580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayable::setProperty(int index, SkScriptValue& ) {
50680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //SkASSERT(0);
50780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
50880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
50980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
51080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::setReference(const SkMemberInfo* info, SkDisplayable* displayable) {
51180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (info->fType == SkType_MemberProperty) {
51280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScriptValue scriptValue;
51380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        scriptValue.fOperand.fDisplayable = displayable;
51480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        scriptValue.fType = displayable->getType();
51580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        setProperty(info->propertyIndex(), scriptValue);
51680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else if (info->fType == SkType_Array) {
51780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(displayable->getType() == SkType_Array);
51880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDisplayArray* dispArray = (SkDisplayArray*) displayable;
51980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkTDScalarArray* array = (SkTDScalarArray* ) info->memberData(this);
52080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        array->setCount(dispArray->values.count());
52180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        memcpy(array->begin(), dispArray->values.begin(), dispArray->values.count() * sizeof(int));
52280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //
52380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
52480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // !!! need a way for interpreter engine to own array
52580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // !!! probably need to replace all scriptable arrays with single bigger array
52680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // that has operand and type on every element -- or
52780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // when array is dirtied, need to get parent to reparse to local array
52880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
52980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void* storage = info->memberData(this);
53080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        memcpy(storage, &displayable, sizeof(SkDisplayable*));
53180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
53280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// !!! unclear why displayable is dirtied here
53380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// if this is called, this breaks fromPath.xml
53480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  displayable->dirty();
53580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
53680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
53780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
53880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayable::validate() {
53980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
54080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
541