180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDump.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateMaker.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimatorScript.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayEvents.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayList.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_USE_CONDENSED_INFO == 0
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo SkDump::fInfo[] = {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(displayList, Boolean),
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(eventList, Boolean),
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(events, Boolean),
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(groups, Boolean),
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(name, String),
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(posts, Boolean),
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(script, String)
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_GET_MEMBER(SkDump);
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDump::SkDump() : displayList(-1), eventList(-1), events(-1), groups(-1), posts(-1) {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDump::enable(SkAnimateMaker& maker ) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (script.size() > 0)
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return evaluate(maker);
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool hasAttr = false;
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (events > 0)
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hasAttr |= maker.fDumpEvents = true;
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (posts > 0)
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hasAttr |= maker.fDumpPosts = true;
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (groups > 0)
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hasAttr |= maker.fDumpGConditions = true;
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if ((hasAttr |= (eventList > 0)) == true)
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        maker.fEvents.dump(maker);
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if ((hasAttr |= (name.size() > 0)) == true)
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        maker.dump(name.c_str());
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (displayList > 0 || (displayList != 0 && hasAttr == false))
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        maker.fDisplayList.dump(&maker);
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDump::evaluate(SkAnimateMaker &maker) {
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimatorScript scriptEngine(maker, NULL, SkType_Int);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScriptValue value;
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* cScript = script.c_str();
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool success = scriptEngine.evaluateScript(&cScript, &value);
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("%*s<dump script=\"%s\" answer=\" ", SkDisplayList::fIndent, "", script.c_str());
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (success == false) {
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("INVALID\" />\n");
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return false;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (value.fType) {
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkType_Float:
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%g\" />\n", SkScalarToFloat(value.fOperand.fScalar));
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkType_Int:
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%d\" />\n", value.fOperand.fS32);
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkType_String:
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("%s\" />\n", value.fOperand.fString->c_str());
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDump::hasEnable() const {
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDump::GetEnumString(SkDisplayTypes type, int index, SkString* result) {
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int badEnum = index;
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkDisplayEnumMap& map = SkAnimatorScript::GetEnumValues(type);
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* str  = map.fValues;
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    while (--index >= 0) {
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str = strchr(str, '|');
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (str == NULL) {
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result->reset();
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result->appendS32(badEnum);
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str += 1;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* end = strchr(str, '|');
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (end == NULL)
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        end = str + strlen(str);
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result->set(str, end - str);
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// in the release version, <dump> is allowed, and its attributes are defined, but
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// are not stored and have no effect
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_USE_CONDENSED_INFO == 0
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkDump_Properties {
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(displayList),
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(eventList),
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(events),
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(groups),
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(name),
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(posts),
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(script)
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo SkDump::fInfo[] = {
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(displayList, Boolean),
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(eventList, Boolean),
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(events, Boolean),
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(groups, Boolean),
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(name, String),
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(posts, Boolean),
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(script, String)
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_GET_MEMBER(SkDump);
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
138096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool SkDump::enable(SkAnimateMaker&) {
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDump::hasEnable() const {
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
146096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool SkDump::setProperty(int index, SkScriptValue&) {
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return index <= SK_PROPERTY(posts);
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
151