| |
| /* |
| * Copyright 2006 The Android Open Source Project |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #include "SkDump.h" |
| |
| #ifdef SK_DUMP_ENABLED |
| |
| #include "SkAnimateMaker.h" |
| #include "SkAnimatorScript.h" |
| #include "SkDisplayEvents.h" |
| #include "SkDisplayList.h" |
| #include "SkString.h" |
| |
| #if SK_USE_CONDENSED_INFO == 0 |
| |
| const SkMemberInfo SkDump::fInfo[] = { |
| SK_MEMBER(displayList, Boolean), |
| SK_MEMBER(eventList, Boolean), |
| SK_MEMBER(events, Boolean), |
| SK_MEMBER(groups, Boolean), |
| SK_MEMBER(name, String), |
| SK_MEMBER(posts, Boolean), |
| SK_MEMBER(script, String) |
| }; |
| |
| #endif |
| |
| DEFINE_GET_MEMBER(SkDump); |
| |
| SkDump::SkDump() : displayList(-1), eventList(-1), events(-1), groups(-1), posts(-1) { |
| } |
| |
| bool SkDump::enable(SkAnimateMaker& maker ) { |
| if (script.size() > 0) |
| return evaluate(maker); |
| bool hasAttr = false; |
| if (events > 0) |
| hasAttr |= maker.fDumpEvents = true; |
| if (posts > 0) |
| hasAttr |= maker.fDumpPosts = true; |
| if (groups > 0) |
| hasAttr |= maker.fDumpGConditions = true; |
| if ((hasAttr |= (eventList > 0)) == true) |
| maker.fEvents.dump(maker); |
| if ((hasAttr |= (name.size() > 0)) == true) |
| maker.dump(name.c_str()); |
| if (displayList > 0 || (displayList != 0 && hasAttr == false)) |
| maker.fDisplayList.dump(&maker); |
| return true; |
| } |
| |
| bool SkDump::evaluate(SkAnimateMaker &maker) { |
| SkAnimatorScript scriptEngine(maker, NULL, SkType_Int); |
| SkScriptValue value; |
| const char* cScript = script.c_str(); |
| bool success = scriptEngine.evaluateScript(&cScript, &value); |
| SkDebugf("%*s<dump script=\"%s\" answer=\" ", SkDisplayList::fIndent, "", script.c_str()); |
| if (success == false) { |
| SkDebugf("INVALID\" />\n"); |
| return false; |
| } |
| switch (value.fType) { |
| case SkType_Float: |
| SkDebugf("%g\" />\n", SkScalarToFloat(value.fOperand.fScalar)); |
| break; |
| case SkType_Int: |
| SkDebugf("%d\" />\n", value.fOperand.fS32); |
| break; |
| case SkType_String: |
| SkDebugf("%s\" />\n", value.fOperand.fString->c_str()); |
| break; |
| default: |
| return false; |
| } |
| return true; |
| } |
| |
| bool SkDump::hasEnable() const { |
| return true; |
| } |
| |
| void SkDump::GetEnumString(SkDisplayTypes type, int index, SkString* result) { |
| int badEnum = index; |
| const SkDisplayEnumMap& map = SkAnimatorScript::GetEnumValues(type); |
| const char* str = map.fValues; |
| while (--index >= 0) { |
| str = strchr(str, '|'); |
| if (str == NULL) { |
| result->reset(); |
| result->appendS32(badEnum); |
| return; |
| } |
| str += 1; |
| } |
| const char* end = strchr(str, '|'); |
| if (end == NULL) |
| end = str + strlen(str); |
| result->set(str, end - str); |
| } |
| |
| #else |
| |
| // in the release version, <dump> is allowed, and its attributes are defined, but |
| // are not stored and have no effect |
| |
| #if SK_USE_CONDENSED_INFO == 0 |
| |
| enum SkDump_Properties { |
| SK_PROPERTY(displayList), |
| SK_PROPERTY(eventList), |
| SK_PROPERTY(events), |
| SK_PROPERTY(groups), |
| SK_PROPERTY(name), |
| SK_PROPERTY(posts), |
| SK_PROPERTY(script) |
| }; |
| |
| const SkMemberInfo SkDump::fInfo[] = { |
| SK_MEMBER_PROPERTY(displayList, Boolean), |
| SK_MEMBER_PROPERTY(eventList, Boolean), |
| SK_MEMBER_PROPERTY(events, Boolean), |
| SK_MEMBER_PROPERTY(groups, Boolean), |
| SK_MEMBER_PROPERTY(name, String), |
| SK_MEMBER_PROPERTY(posts, Boolean), |
| SK_MEMBER_PROPERTY(script, String) |
| }; |
| |
| #endif |
| |
| DEFINE_GET_MEMBER(SkDump); |
| |
| bool SkDump::enable(SkAnimateMaker&) { |
| return true; |
| } |
| |
| bool SkDump::hasEnable() const { |
| return true; |
| } |
| |
| bool SkDump::setProperty(int index, SkScriptValue&) { |
| return index <= SK_PROPERTY(posts); |
| } |
| |
| #endif |