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 "SkDisplayEvent.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayApply.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayInput.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayList.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDump.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkEvent.h"
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayInput.h"
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkKey.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMetaData.h"
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript.h"
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkUtils.h"
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkDisplayEvent_Properties {
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(key),
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(keys)
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDisplayEvent::fInfo[] = {
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(code, EventCode),
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(disable, Boolean),
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(key, String), // a single key (also last key pressed)
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(keys, String), // a single key or dash-delimited range of keys
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(kind, EventKind),
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(target, String),
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(x, Float),
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(y, Float)
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDisplayEvent);
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayEvent::SkDisplayEvent() : code((SkKey) -1), disable(false),
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    kind(kUser), x(0), y(0), fLastCode((SkKey) -1), fMax((SkKey) -1), fTarget(NULL) {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayEvent::~SkDisplayEvent() {
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    deleteMembers();
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayEvent::add(SkAnimateMaker& , SkDisplayable* child) {
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *fChildren.append() = child;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayEvent::contains(SkDisplayable* match) {
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < fChildren.count(); index++) {
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fChildren[index] == match || fChildren[index]->contains(match))
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDisplayEvent::contains(const SkString& match) {
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < fChildren.count(); index++) {
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* child = fChildren[index];
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (child->contains(match))
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return child;
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return NULL;
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayEvent::deleteMembers() {
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < fChildren.count(); index++) {
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* evt = fChildren[index];
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        delete evt;
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayEvent::dumpEvent(SkAnimateMaker* maker) {
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString str;
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDump::GetEnumString(SkType_EventKind, kind, &str);
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("kind=\"%s\" ", str.c_str());
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (kind == SkDisplayEvent::kKeyPress || kind == SkDisplayEvent::kKeyPressUp) {
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (code >= 0)
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDump::GetEnumString(SkType_EventCode, code, &str);
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            str.set("none");
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("code=\"%s\" ", str.c_str());
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (kind == SkDisplayEvent::kKeyChar) {
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fMax != (SkKey) -1 && fMax != code)
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("keys=\"%c - %c\" ", code, fMax);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("key=\"%c\" ", code);
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fTarget != NULL) {
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("target=\"%s\" ", fTarget->id);
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) {
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("x=\"%g\" y=\"%g\" ", SkScalarToFloat(x), SkScalarToFloat(y));
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("x=\"%x\" y=\"%x\" ", x, y);
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (disable)
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("disable=\"true\" ");
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("/>\n");
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayEvent::enableEvent(SkAnimateMaker& maker)
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    maker.fActiveEvent = this;
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fChildren.count() == 0)
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (disable)
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (maker.fDumpEvents) {
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("enable: ");
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dumpEvent(&maker);
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayList& displayList = maker.fDisplayList;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int index = 0; index < fChildren.count(); index++) {
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* displayable = fChildren[index];
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (displayable->isGroup()) {
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTDDrawableArray* parentList = displayList.getDrawList();
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *parentList->append() = (SkDrawable*) displayable;  // make it findable before children are enabled
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (displayable->enable(maker))
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (maker.hasError())
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (displayable->isDrawable() == false)
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;    // error
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDrawable* drawable = (SkDrawable*) displayable;
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkTDDrawableArray* parentList = displayList.getDrawList();
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *parentList->append() = drawable;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayEvent::getProperty(int index, SkScriptValue* value) const {
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(key):
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(keys): {
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fType = SkType_String;
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            char scratch[8];
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkKey convert = index == SK_PROPERTY(keys) ? code : fLastCode;
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            size_t size = convert > 0 ? SkUTF8_FromUnichar(convert, scratch) : 0;
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fKeyString.set(scratch, size);
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fString = &fKeyString;
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (index != SK_PROPERTY(keys) || fMax == (SkKey) -1 || fMax == code)
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fString->append("-");
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            size = SkUTF8_FromUnichar(fMax, scratch);
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            value->fOperand.fString->append(scratch, size);
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayEvent::onEndElement(SkAnimateMaker& maker)
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (kind == kUser)
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    maker.fEvents.addEvent(this);
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (kind == kOnEnd) {
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool found = maker.find(target.c_str(), &fTarget);
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(found);
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(fTarget && fTarget->isAnimate());
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkAnimateBase* animate = (SkAnimateBase*) fTarget;
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        animate->setHasEndEvent();
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDisplayEvent::populateInput(SkAnimateMaker& maker, const SkEvent& fEvent) {
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMetaData& meta = fEvent.getMetaData();
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMetaData::Iter iter(meta);
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMetaData::Type    type;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int number;
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* name;
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while ((name = iter.next(&type, &number)) != NULL) {
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (name[0] == '\0')
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* displayable;
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkInput* input;
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (int index = 0; index < fChildren.count(); index++) {
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            displayable = fChildren[index];
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (displayable->getType() != SkType_Input)
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                continue;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            input = (SkInput*) displayable;
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (input->name.equals(name))
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                goto found;
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!maker.find(name, &displayable) || displayable->getType() != SkType_Input)
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        input = (SkInput*) displayable;
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    found:
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (type) {
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kS32_Type:
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                meta.findS32(name, &input->fInt);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kScalar_Type:
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                meta.findScalar(name, &input->fFloat);
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kPtr_Type:
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkASSERT(0);
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break; // !!! not handled for now
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kString_Type:
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                input->string.set(meta.findString(name));
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkASSERT(0);
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // re-evaluate all animators that may have built their values from input strings
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (SkDisplayable** childPtr = fChildren.begin(); childPtr < fChildren.end(); childPtr++) {
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* displayable = *childPtr;
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (displayable->isApply() == false)
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkApply* apply = (SkApply*) displayable;
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        apply->refresh(maker);
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDisplayEvent::setProperty(int index, SkScriptValue& value) {
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(index == SK_PROPERTY(key) || index == SK_PROPERTY(keys));
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(value.fType == SkType_String);
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString* string = value.fOperand.fString;
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* chars = string->c_str();
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int count = SkUTF8_CountUnichars(chars);
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count >= 1);
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    code = (SkKey) SkUTF8_NextUnichar(&chars);
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fMax = code;
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count == 1 || index == SK_PROPERTY(keys));
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (--count > 0) {
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(*chars == '-');
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        chars++;
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fMax = (SkKey) SkUTF8_NextUnichar(&chars);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(fMax >= code);
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMetaData.h"
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkParse.h"
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTextBox.h"
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkXMLWriter.h"
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkMetaData::setPtr(char const*, void*, PtrProc ) {}
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMetaData::setS32(char const*, int ) {}
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkEventSink::doEvent(SkEvent const& ) { return false; }
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::parse(SkStream& ) { return false; }
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLParserError::SkXMLParserError( ) {}
2704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkEvent::setType(char const*, size_t ) {}
2714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkEvent::postTime(SkMSec) {}
2724f1dae40e24d57d647db01443b8bf2410514b8b5Derek SollenbergerSkEvent::SkEvent(char const*, SkEventSinkID) {}
2734f1dae40e24d57d647db01443b8bf2410514b8b5Derek SollenbergerSkEvent::SkEvent(SkEvent const&) {}
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkEvent::SkEvent( ) {}
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkEvent::~SkEvent( ) {}
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkEventSink::onQuery(SkEvent* ) { return false; }
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkEventSink::SkEventSink( ) {}
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkEventSink::~SkEventSink( ) {}
2794f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkXMLParser::parse(char const*, size_t ) { return false; }
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::parse(SkDOM const&, SkDOMNode const* ) { return false; }
2814f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger//void SkParse::UnitTest( ) {}
2824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerconst char* SkMetaData::findString(char const* ) const {return 0;}
2834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkMetaData::findPtr(char const*, void**, PtrProc* ) const {return false;}
2844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkMetaData::findS32(char const*, int* ) const {return false;}
2854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkEvent::isType(char const*, size_t ) const { return false; }
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMetaData::setString(char const*, char const* ) {}
2874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerconst char* SkParse::FindNamedColor(char const*, size_t, SkColor* ) {return false; }
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkMetaData::Iter::next(SkMetaData::Type*, int* ) { return false; }
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkMetaData::Iter::Iter(SkMetaData const& ) {}
2904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkMetaData::findScalar(char const*, SkScalar* ) const {return false;}
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkMetaData::reset( ) {}
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkEvent::setType(SkString const& ) {}
2934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkMetaData::findBool(char const*, bool* ) const {return false;}
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkEvent::getType(SkString*) const {}
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::endElement(char const* ) { return false; }
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::addAttribute(char const*, char const* ) { return false;}
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::startElement(char const* ) { return false;}
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::text(char const*, int ) { return false;}
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::onText(char const*, int ) { return false;}
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLParser::SkXMLParser(SkXMLParserError* ) {}
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLParser::~SkXMLParser( ) {}
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLParserError::~SkXMLParserError( ) {}
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkXMLParserError::getErrorString(SkString*) const {}
3044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkTextBox::setSpacing(SkScalar, SkScalar ) {}
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkTextBox::setSpacingAlign(SkTextBox::SpacingAlign ) {}
3064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkTextBox::draw(SkCanvas*, char const*, size_t, SkPaint const& ) {}
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkTextBox::setBox(SkRect const& ) {}
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkTextBox::setMode(SkTextBox::Mode ) {}
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTextBox::SkTextBox( ) {}
3104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid SkMetaData::setScalar(char const*, SkScalar ) {}
3114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerconst char* SkParse::FindScalar(char const*, SkScalar* ) {return 0; }
3124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerconst char* SkParse::FindScalars(char const*, SkScalar*, int ) {return 0; }
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkParse::FindHex(char const*, unsigned int* ) {return 0; }
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkParse::FindS32(char const*, int* ) {return 0; }
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkXMLWriter::addAttribute(char const*, char const* ) {}
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkXMLWriter::startElement(char const* ) {}
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkXMLWriter::doEnd(SkXMLWriter::Elem* ) {}
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLWriter::Elem* SkXMLWriter::getEnd( ) { return 0; }
3194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool SkXMLWriter::doStart(char const*, size_t ) { return false; }
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLWriter::SkXMLWriter(bool ) {}
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkXMLWriter::~SkXMLWriter( ) {}
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkMetaData::SkMetaData() {}
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkMetaData::~SkMetaData() {}
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkEventSink::onEvent(SkEvent const&) {return false;}
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::onEndElement(char const*) {return false;}
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::onAddAttribute(char const*, char const*) {return false;}
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkXMLParser::onStartElement(char const*) {return false;}
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkXMLWriter::writeHeader() {}
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
331