1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayEvent.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayInput.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayList.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDump.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEvent.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayInput.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkKey.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMetaData.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScript.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comenum SkDisplayEvent_Properties {
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_PROPERTY(key),
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_PROPERTY(keys)
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDisplayEvent::fInfo[] = {
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(code, EventCode),
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(disable, Boolean),
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(key, String), // a single key (also last key pressed)
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(keys, String), // a single key or dash-delimited range of keys
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(kind, EventKind),
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(target, String),
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(x, Float),
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(y, Float)
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDisplayEvent);
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayEvent::SkDisplayEvent() : code((SkKey) -1), disable(false),
482880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    kind(kUser), x(0), y(0), fLastCode((SkKey) -1), fMax((SkKey) -1), fTarget(nullptr) {
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayEvent::~SkDisplayEvent() {
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    deleteMembers();
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
551d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkDisplayEvent::addChild(SkAnimateMaker& , SkDisplayable* child) {
56d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    *fChildren.append() = child;
57d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return true;
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDisplayEvent::contains(SkDisplayable* match) {
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < fChildren.count(); index++) {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fChildren[index] == match || fChildren[index]->contains(match))
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayable* SkDisplayEvent::contains(const SkString& match) {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < fChildren.count(); index++) {
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* child = fChildren[index];
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (child->contains(match))
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return child;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
742880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    return nullptr;
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDisplayEvent::deleteMembers() {
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < fChildren.count(); index++) {
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* evt = fChildren[index];
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete evt;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDisplayEvent::dumpEvent(SkAnimateMaker* maker) {
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dumpBase(maker);
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString str;
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDump::GetEnumString(SkType_EventKind, kind, &str);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugf("kind=\"%s\" ", str.c_str());
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (kind == SkDisplayEvent::kKeyPress || kind == SkDisplayEvent::kKeyPressUp) {
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (code >= 0)
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDump::GetEnumString(SkType_EventCode, code, &str);
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str.set("none");
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("code=\"%s\" ", str.c_str());
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (kind == SkDisplayEvent::kKeyChar) {
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fMax != (SkKey) -1 && fMax != code)
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("keys=\"%c - %c\" ", code, fMax);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("key=\"%c\" ", code);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1032880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (fTarget != nullptr) {
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("target=\"%s\" ", fTarget->id);
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) {
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("x=\"%g\" y=\"%g\" ", SkScalarToFloat(x), SkScalarToFloat(y));
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (disable)
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("disable=\"true\" ");
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugf("/>\n");
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkDisplayEvent::enableEvent(SkAnimateMaker& maker)
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    maker.fActiveEvent = this;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fChildren.count() == 0)
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return false;
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (disable)
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return false;
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (maker.fDumpEvents) {
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("enable: ");
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dumpEvent(&maker);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayList& displayList = maker.fDisplayList;
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < fChildren.count(); index++) {
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable = fChildren[index];
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (displayable->isGroup()) {
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkTDDrawableArray* parentList = displayList.getDrawList();
133986ca61cf7be3ec590f8820e9b7ba042ac2948fereed            *parentList->append() = (SkADrawable*) displayable;  // make it findable before children are enabled
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (displayable->enable(maker))
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
137d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        if (maker.hasError())
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (displayable->isDrawable() == false)
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;    // error
141986ca61cf7be3ec590f8820e9b7ba042ac2948fereed        SkADrawable* drawable = (SkADrawable*) displayable;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkTDDrawableArray* parentList = displayList.getDrawList();
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        *parentList->append() = drawable;
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDisplayEvent::getProperty(int index, SkScriptValue* value) const {
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (index) {
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(key):
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(keys): {
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fType = SkType_String;
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            char scratch[8];
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkKey convert = index == SK_PROPERTY(keys) ? code : fLastCode;
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            size_t size = convert > 0 ? SkUTF8_FromUnichar(convert, scratch) : 0;
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fKeyString.set(scratch, size);
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fString = &fKeyString;
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (index != SK_PROPERTY(keys) || fMax == (SkKey) -1 || fMax == code)
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fString->append("-");
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            size = SkUTF8_FromUnichar(fMax, scratch);
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            value->fOperand.fString->append(scratch, size);
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            } break;
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(0);
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return false;
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDisplayEvent::onEndElement(SkAnimateMaker& maker)
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (kind == kUser)
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return;
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    maker.fEvents.addEvent(this);
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (kind == kOnEnd) {
1770e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com        SkDEBUGCODE(bool found = ) maker.find(target.c_str(), &fTarget);
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(found);
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fTarget && fTarget->isAnimate());
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimateBase* animate = (SkAnimateBase*) fTarget;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        animate->setHasEndEvent();
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDisplayEvent::populateInput(SkAnimateMaker& maker, const SkEvent& fEvent) {
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMetaData& meta = fEvent.getMetaData();
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMetaData::Iter iter(meta);
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMetaData::Type    type;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int number;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* name;
1912880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    while ((name = iter.next(&type, &number)) != nullptr) {
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (name[0] == '\0')
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable;
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkInput* input;
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int index = 0; index < fChildren.count(); index++) {
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            displayable = fChildren[index];
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (displayable->getType() != SkType_Input)
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                continue;
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            input = (SkInput*) displayable;
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (input->name.equals(name))
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto found;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (!maker.find(name, &displayable) || displayable->getType() != SkType_Input)
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        input = (SkInput*) displayable;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    found:
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (type) {
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kS32_Type:
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                meta.findS32(name, &input->fInt);
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kScalar_Type:
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                meta.findScalar(name, &input->fFloat);
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kPtr_Type:
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0);
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break; // !!! not handled for now
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kString_Type:
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                input->string.set(meta.findString(name));
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0);
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // re-evaluate all animators that may have built their values from input strings
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkDisplayable** childPtr = fChildren.begin(); childPtr < fChildren.end(); childPtr++) {
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable = *childPtr;
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (displayable->isApply() == false)
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkApply* apply = (SkApply*) displayable;
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        apply->refresh(maker);
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDisplayEvent::setProperty(int index, SkScriptValue& value) {
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(index == SK_PROPERTY(key) || index == SK_PROPERTY(keys));
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(value.fType == SkType_String);
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString* string = value.fOperand.fString;
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* chars = string->c_str();
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int count = SkUTF8_CountUnichars(chars);
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(count >= 1);
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    code = (SkKey) SkUTF8_NextUnichar(&chars);
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fMax = code;
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(count == 1 || index == SK_PROPERTY(keys));
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (--count > 0) {
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(*chars == '-');
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        chars++;
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fMax = (SkKey) SkUTF8_NextUnichar(&chars);
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fMax >= code);
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
253