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) {
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimatorScript scriptEngine(maker, NULL, 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, '|');
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (str == NULL) {
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, '|');
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (end == NULL)
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