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