11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayable.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayApply.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkParse.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayList.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayTypes.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_FIND_LEAKS
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// int SkDisplayable::fAllocationCount;
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTDDisplayableArray SkDisplayable::fAllocations;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable::SkDisplayable() {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    id = _id.c_str();
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_FIND_LEAKS
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // fAllocationCount++;
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *fAllocations.append() = this;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable::~SkDisplayable() {
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_FIND_LEAKS
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //  fAllocationCount--;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = fAllocations.find(this);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(index >= 0);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fAllocations.remove(index);
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::add(SkAnimateMaker& , SkDisplayable* child) {
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//void SkDisplayable::apply(SkAnimateMaker& , const SkMemberInfo* ,
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//      SkDisplayable* , SkScalar [], int count) {
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  SkASSERT(0);
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//}
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::canContainDependents() const {
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::childrenNeedDisposing() const {
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::clearBounder() {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::contains(SkDisplayable* ) {
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDisplayable::contains(const SkString& ) {
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDisplayable::deepCopy(SkAnimateMaker* maker) {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes type = getType();
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (type == SkType_Unknown) {
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return NULL;
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayable* copy = SkDisplayType::CreateInstance(maker, type);
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = -1;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int propIndex = 0;
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMemberInfo* info;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        info = copy->getMember(++index);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info == NULL)
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_MemberProperty) {
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScriptValue value;
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (getProperty(propIndex, &value))
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                copy->setProperty(propIndex, value);
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            propIndex++;
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_MemberFunction)
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_Array) {
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this);
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int arrayCount;
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (array == NULL || (arrayCount = array->count()) == 0)
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                continue;
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTDOperandArray* copyArray = (SkTDOperandArray*) info->memberData(copy);
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            copyArray->setCount(arrayCount);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayTypes elementType;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (type == SkType_Array) {
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDisplayArray* dispArray = (SkDisplayArray*) this;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                elementType = dispArray->values.getType();
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } else
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                elementType = info->arrayType();
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            size_t elementSize = SkMemberInfo::GetSize(elementType);
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            size_t byteSize = elementSize * arrayCount;
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(copyArray->begin(), array->begin(), byteSize);
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayable** displayable = (SkDisplayable**) info->memberData(this);
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (*displayable == NULL || *displayable == (SkDisplayable*) -1)
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                continue;
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayable* deeper = (*displayable)->deepCopy(maker);
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info->setMemberData(copy, deeper, sizeof(deeper));
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_String || info->fType == SkType_DynamicString) {
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkString* string;
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info->getString(this, &string);
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info->setString(copy, string);
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void* data = info->memberData(this);
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size_t size = SkMemberInfo::GetSize(info->fType);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        info->setMemberData(copy, data, size);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (true);
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->dirty();
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return copy;
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dirty() {
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dump(SkAnimateMaker* maker) {
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->dumpAttrs(maker);
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->dumpChildren(maker);
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpAttrs(SkAnimateMaker* maker) {
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes type = getType();
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (type == SkType_Unknown) {
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //SkDebugf("/>\n");
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayable* blankCopy = SkDisplayType::CreateInstance(maker, type);
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = -1;
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int propIndex = 0;
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMemberInfo* info;
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMemberInfo* blankInfo;
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScriptValue value;
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScriptValue blankValue;
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkOperand values[2];
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkOperand blankValues[2];
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        info = this->getMember(++index);
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (NULL == info) {
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            //SkDebugf("\n");
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkType_MemberProperty == info->fType) {
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (getProperty(propIndex, &value)) {
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                blankCopy->getProperty(propIndex, &blankValue);
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                //last two are dummies
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                dumpValues(info, value.fType, value.fOperand, blankValue.fOperand, value.fOperand, blankValue.fOperand);
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                }
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            propIndex++;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_MemberFunction)
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_Array) {
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this);
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int arrayCount;
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (array == NULL || (arrayCount = array->count()) == 0)
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                continue;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayTypes elementType;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (type == SkType_Array) {
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDisplayArray* dispArray = (SkDisplayArray*) this;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                elementType = dispArray->values.getType();
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } else
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                elementType = info->arrayType();
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            bool firstElem = true;
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"[", info->fName);
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            for (SkOperand* op = array->begin(); op < array->end(); op++) {
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (!firstElem) SkDebugf(",");
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                switch (elementType) {
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        case SkType_Displayable:
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkDebugf("%s", op->fDisplayable->id);
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            break;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        case SkType_Int:
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkDebugf("%d", op->fS32);
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            break;
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        case SkType_Float:
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkDebugf("%g", SkScalarToFloat(op->fScalar));
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkDebugf("%x", op->fScalar);
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            break;
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        case SkType_String:
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        case SkType_DynamicString:
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkDebugf("%s", op->fString->c_str());
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            break;
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        default:
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            break;
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                }
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                firstElem = false;
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("]\" ");
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (info->fType == SkType_String || info->fType == SkType_DynamicString) {
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkString* string;
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            info->getString(this, &string);
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (string->isEmpty() == false)
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\"\t", info->fName, string->c_str());
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        blankInfo = blankCopy->getMember(index);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int i = info->fCount;
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        info->getValue(this, values, i);
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        blankInfo->getValue(blankCopy, blankValues, i);
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dumpValues(info, info->fType, values[0], blankValues[0], values[1], blankValues[1]);
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (true);
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete blankCopy;
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpBase(SkAnimateMaker* maker) {
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes type = getType();
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* elementName = "(unknown)";
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (type != SkType_Unknown && type != SkType_Screenplay)
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        elementName = SkDisplayType::GetName(maker, type);
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("%*s", SkDisplayList::fIndent, "");
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (SkDisplayList::fDumpIndex != 0 && SkDisplayList::fIndent == 0)
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("%d: ", SkDisplayList::fDumpIndex);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("<%s ", elementName);
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (strcmp(id,"") != 0)
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("id=\"%s\" ", id);
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpChildren(SkAnimateMaker* maker, bool closedAngle) {
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = -1;
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMemberInfo* info;
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = -1;
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayList::fIndent += 4;
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        info = this->getMember(++index);
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (NULL == info) {
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkDisplayType::IsDisplayable(maker, info->fType)) {
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayable** displayable = (SkDisplayable**) info->memberData(this);
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (*displayable == NULL || *displayable == (SkDisplayable*) -1)
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                continue;
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (closedAngle == false) {
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf(">\n");
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                closedAngle = true;
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            (*displayable)->dump(maker);
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (true);
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayList::fIndent -= 4;
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (closedAngle)
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dumpEnd(maker);
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("/>\n");
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpEnd(SkAnimateMaker* maker) {
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayTypes type = getType();
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* elementName = "(unknown)";
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (type != SkType_Unknown && type != SkType_Screenplay)
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        elementName = SkDisplayType::GetName(maker, type);
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("%*s", SkDisplayList::fIndent, "");
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("</%s>\n", elementName);
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpEvents() {
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::dumpValues(const SkMemberInfo* info, SkDisplayTypes type, SkOperand op, SkOperand blankOp,
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkOperand op2, SkOperand blankOp2) {
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (type) {
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_BitmapEncoding:
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (op.fS32) {
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 0 : SkDebugf("type=\"jpeg\" ");
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 1 : SkDebugf("type=\"png\" ");
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default: SkDebugf("type=\"UNDEFINED\" ");
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //should make this a separate case in dump attrs, rather than make dump values have a larger signature
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_Point:
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fScalar != blankOp.fScalar || op2.fScalar != blankOp.fScalar) {
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"[%g,%g]\" ", info->fName, SkScalarToFloat(op.fScalar), SkScalarToFloat(op2.fScalar));
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"[%x,%x]\" ", info->fName, op.fScalar, op2.fScalar);
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_FromPathMode:
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (op.fS32) {
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 0:
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                //don't want to print anything for 0, just adding it to remove it from default:
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 1:
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\" ", info->fName, "angle");
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 2:
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\" ", info->fName, "position");
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"INVALID\" ", info->fName);
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_MaskFilterBlurStyle:
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (op.fS32) {
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 0:
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 1:
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\" ", info->fName, "solid");
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 2:
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\" ", info->fName, "outer");
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 3:
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"%s\" ", info->fName, "inner");
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("%s=\"INVALID\" ", info->fName);
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_FilterType:
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fS32 == 1)
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%s\" ", info->fName, "bilinear");
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_PathDirection:
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "cw" : "ccw");
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_FillType:
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "winding" : "evenOdd");
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_TileMode:
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //correct to look at the S32?
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fS32 != blankOp.fS32)
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "clamp" : op.fS32 == 1 ? "repeat" : "mirror");
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_Boolean:
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fS32 != blankOp.fS32)
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "false" : "true");
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_Int:
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fS32 != blankOp.fS32)
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" %s=\"%d\"  ", info->fName, op.fS32);
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_Float:
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fScalar != blankOp.fScalar) { //or /65536?
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%g\"  ", info->fName, SkScalarToFloat(op.fScalar));
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%x\"  ", info->fName, op.fScalar);
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_String:
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_DynamicString:
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fString->size() > 0)
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("%s=\"%s\" ", info->fName, op.fString->c_str());
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkType_MSec:
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (op.fS32 != blankOp.fS32) {
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" %s=\"%g\"  ", info->fName, SkScalarToFloat(SkScalarDiv(op.fS32, 1000)));
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" %s=\"%x\"  ", info->fName, SkScalarDiv(op.fS32, 1000));
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    default:
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("");
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::enable( SkAnimateMaker& ) {
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::enableBounder() {
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::executeFunction(SkDisplayable* , int index,
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkTDArray<SkScriptValue>& , SkDisplayTypes, SkScriptValue*  ) {
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(0);
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::executeFunction(SkDisplayable* target,
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkMemberInfo* info, SkTypedArray* values, SkScriptValue* value) {
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTDArray<SkScriptValue> typedValues;
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (SkOperand* op = values->begin(); op < values->end(); op++) {
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScriptValue temp;
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        temp.fType = values->getType();
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        temp.fOperand = *op;
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *typedValues.append() = temp;
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    executeFunction(target, info->functionIndex(), typedValues, info->getType(), value);
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::executeFunction2(SkDisplayable* , int index,
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkOpArray* params, SkDisplayTypes, SkOperand2*  ) {
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(0);
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::getBounds(SkRect* rect) {
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(rect);
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rect->fLeft = rect->fTop = SK_ScalarMax;
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rect->fRight= rect->fBottom = -SK_ScalarMax;
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkFunctionParamType* SkDisplayable::getFunctionsParameters() {
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo* SkDisplayable::getMember(int index) {
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo* SkDisplayable::getMember(const char name[]) {
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkFunctionParamType* SkDisplayable::getParameters(const SkMemberInfo* info,
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int* paramCount) {
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFunctionParamType* params = getFunctionsParameters();
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(params != NULL);
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int funcIndex = info->functionIndex();
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // !!! eventually break traversing params into an external function (maybe this whole function)
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = funcIndex;
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int offset = 0;
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (--index >= 0) {
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (params[offset] != 0)
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            offset++;
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offset++;
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = 0;
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while (params[offset] != 0) {
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        count++;
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        offset++;
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *paramCount = count;
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return &params[offset - count];
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDisplayable::getParent() const {
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::getProperty(int index, SkScriptValue* ) const {
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  SkASSERT(0);
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::getProperty2(int index, SkOperand2* value) const {
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(0);
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayTypes SkDisplayable::getType() const {
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkType_Unknown;
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::hasEnable() const {
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::isDrawable() const {
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::onEndElement(SkAnimateMaker& ) {}
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo* SkDisplayable::preferredChild(SkDisplayTypes type) {
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::resolveIDs(SkAnimateMaker& maker, SkDisplayable* original, SkApply* apply) {
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//SkDisplayable* SkDisplayable::resolveTarget(SkAnimateMaker& ) {
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  return this;
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//}
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::setChildHasID() {
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::setParent(SkDisplayable* ) {
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayable::setProperty(int index, SkScriptValue& ) {
5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //SkASSERT(0);
5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::setReference(const SkMemberInfo* info, SkDisplayable* displayable) {
5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (info->fType == SkType_MemberProperty) {
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScriptValue scriptValue;
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        scriptValue.fOperand.fDisplayable = displayable;
5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        scriptValue.fType = displayable->getType();
5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        setProperty(info->propertyIndex(), scriptValue);
5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else if (info->fType == SkType_Array) {
5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(displayable->getType() == SkType_Array);
5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayArray* dispArray = (SkDisplayArray*) displayable;
5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkTDScalarArray* array = (SkTDScalarArray* ) info->memberData(this);
5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        array->setCount(dispArray->values.count());
5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        memcpy(array->begin(), dispArray->values.begin(), dispArray->values.count() * sizeof(int));
5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //
5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // !!! need a way for interpreter engine to own array
5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // !!! probably need to replace all scriptable arrays with single bigger array
5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // that has operand and type on every element -- or
5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // when array is dirtied, need to get parent to reparse to local array
5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void* storage = info->memberData(this);
5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        memcpy(storage, &displayable, sizeof(SkDisplayable*));
5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// !!! unclear why displayable is dirtied here
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// if this is called, this breaks fromPath.xml
5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  displayable->dirty();
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayable::validate() {
5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
559