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 "SkDump.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimatorScript.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayEvents.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayList.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkString.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDump::fInfo[] = { 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(displayList, Boolean), 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(eventList, Boolean), 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(events, Boolean), 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(groups, Boolean), 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(name, String), 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(posts, Boolean), 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(script, String) 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDump); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDump::SkDump() : displayList(-1), eventList(-1), events(-1), groups(-1), posts(-1) { 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDump::enable(SkAnimateMaker& maker ) { 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (script.size() > 0) 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return evaluate(maker); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool hasAttr = false; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (events > 0) 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com hasAttr |= maker.fDumpEvents = true; 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (posts > 0) 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com hasAttr |= maker.fDumpPosts = true; 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (groups > 0) 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com hasAttr |= maker.fDumpGConditions = true; 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((hasAttr |= (eventList > 0)) == true) 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.fEvents.dump(maker); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((hasAttr |= (name.size() > 0)) == true) 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.dump(name.c_str()); 5364cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org if (displayList > 0 || (displayList != 0 && hasAttr == false)) 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.fDisplayList.dump(&maker); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDump::evaluate(SkAnimateMaker &maker) { 592880df2609eba09b555ca37be04b6ad89290c765Tom Hudson SkAnimatorScript scriptEngine(maker, nullptr, SkType_Int); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScriptValue value; 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* cScript = script.c_str(); 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool success = scriptEngine.evaluateScript(&cScript, &value); 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%*s<dump script=\"%s\" answer=\" ", SkDisplayList::fIndent, "", script.c_str()); 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (success == false) { 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("INVALID\" />\n"); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com switch (value.fType) { 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkType_Float: 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%g\" />\n", SkScalarToFloat(value.fOperand.fScalar)); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkType_Int: 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%d\" />\n", value.fOperand.fS32); 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkType_String: 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%s\" />\n", value.fOperand.fString->c_str()); 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com default: 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDump::hasEnable() const { 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkDump::GetEnumString(SkDisplayTypes type, int index, SkString* result) { 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int badEnum = index; 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkDisplayEnumMap& map = SkAnimatorScript::GetEnumValues(type); 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* str = map.fValues; 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (--index >= 0) { 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com str = strchr(str, '|'); 942880df2609eba09b555ca37be04b6ad89290c765Tom Hudson if (str == nullptr) { 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result->reset(); 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result->appendS32(badEnum); 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com str += 1; 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* end = strchr(str, '|'); 1022880df2609eba09b555ca37be04b6ad89290c765Tom Hudson if (end == nullptr) 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com end = str + strlen(str); 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com result->set(str, end - str); 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// in the release version, <dump> is allowed, and its attributes are defined, but 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// are not stored and have no effect 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comenum SkDump_Properties { 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(displayList), 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(eventList), 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(events), 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(groups), 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(name), 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(posts), 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_PROPERTY(script) 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDump::fInfo[] = { 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(displayList, Boolean), 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(eventList, Boolean), 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(events, Boolean), 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(groups, Boolean), 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(name, String), 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(posts, Boolean), 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_PROPERTY(script, String) 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDump); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 13893c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.combool SkDump::enable(SkAnimateMaker&) { 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDump::hasEnable() const { 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 14693c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.combool SkDump::setProperty(int index, SkScriptValue&) { 147d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return index <= SK_PROPERTY(posts); 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 151