|  | 
 | /* | 
 |  * 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 |