1 
2 /*
3  * Copyright 2006 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #include "SkDump.h"
11 
12 #ifdef SK_DUMP_ENABLED
13 
14 #include "SkAnimateMaker.h"
15 #include "SkAnimatorScript.h"
16 #include "SkDisplayEvents.h"
17 #include "SkDisplayList.h"
18 #include "SkString.h"
19 
20 #if SK_USE_CONDENSED_INFO == 0
21 
22 const SkMemberInfo SkDump::fInfo[] = {
23     SK_MEMBER(displayList, Boolean),
24     SK_MEMBER(eventList, Boolean),
25     SK_MEMBER(events, Boolean),
26     SK_MEMBER(groups, Boolean),
27     SK_MEMBER(name, String),
28     SK_MEMBER(posts, Boolean),
29     SK_MEMBER(script, String)
30 };
31 
32 #endif
33 
34 DEFINE_GET_MEMBER(SkDump);
35 
SkDump()36 SkDump::SkDump() : displayList(-1), eventList(-1), events(-1), groups(-1), posts(-1) {
37 }
38 
enable(SkAnimateMaker & maker)39 bool SkDump::enable(SkAnimateMaker& maker ) {
40     if (script.size() > 0)
41         return evaluate(maker);
42     bool hasAttr = false;
43     if (events > 0)
44         hasAttr |= maker.fDumpEvents = true;
45     if (posts > 0)
46         hasAttr |= maker.fDumpPosts = true;
47     if (groups > 0)
48         hasAttr |= maker.fDumpGConditions = true;
49     if ((hasAttr |= (eventList > 0)) == true)
50         maker.fEvents.dump(maker);
51     if ((hasAttr |= (name.size() > 0)) == true)
52         maker.dump(name.c_str());
53     if (displayList > 0 || (displayList != 0 && hasAttr == false))
54         maker.fDisplayList.dump(&maker);
55     return true;
56 }
57 
evaluate(SkAnimateMaker & maker)58 bool SkDump::evaluate(SkAnimateMaker &maker) {
59     SkAnimatorScript scriptEngine(maker, NULL, SkType_Int);
60     SkScriptValue value;
61     const char* cScript = script.c_str();
62     bool success = scriptEngine.evaluateScript(&cScript, &value);
63     SkDebugf("%*s<dump script=\"%s\" answer=\" ", SkDisplayList::fIndent, "", script.c_str());
64     if (success == false) {
65         SkDebugf("INVALID\" />\n");
66         return false;
67     }
68     switch (value.fType) {
69         case SkType_Float:
70             SkDebugf("%g\" />\n", SkScalarToFloat(value.fOperand.fScalar));
71             break;
72         case SkType_Int:
73             SkDebugf("%d\" />\n", value.fOperand.fS32);
74             break;
75         case SkType_String:
76             SkDebugf("%s\" />\n", value.fOperand.fString->c_str());
77             break;
78         default:
79             return false;
80     }
81     return true;
82 }
83 
hasEnable() const84 bool SkDump::hasEnable() const {
85     return true;
86 }
87 
GetEnumString(SkDisplayTypes type,int index,SkString * result)88 void SkDump::GetEnumString(SkDisplayTypes type, int index, SkString* result) {
89     int badEnum = index;
90     const SkDisplayEnumMap& map = SkAnimatorScript::GetEnumValues(type);
91     const char* str  = map.fValues;
92     while (--index >= 0) {
93         str = strchr(str, '|');
94         if (str == NULL) {
95             result->reset();
96             result->appendS32(badEnum);
97             return;
98         }
99         str += 1;
100     }
101     const char* end = strchr(str, '|');
102     if (end == NULL)
103         end = str + strlen(str);
104     result->set(str, end - str);
105 }
106 
107 #else
108 
109 // in the release version, <dump> is allowed, and its attributes are defined, but
110 // are not stored and have no effect
111 
112 #if SK_USE_CONDENSED_INFO == 0
113 
114 enum SkDump_Properties {
115     SK_PROPERTY(displayList),
116     SK_PROPERTY(eventList),
117     SK_PROPERTY(events),
118     SK_PROPERTY(groups),
119     SK_PROPERTY(name),
120     SK_PROPERTY(posts),
121     SK_PROPERTY(script)
122 };
123 
124 const SkMemberInfo SkDump::fInfo[] = {
125     SK_MEMBER_PROPERTY(displayList, Boolean),
126     SK_MEMBER_PROPERTY(eventList, Boolean),
127     SK_MEMBER_PROPERTY(events, Boolean),
128     SK_MEMBER_PROPERTY(groups, Boolean),
129     SK_MEMBER_PROPERTY(name, String),
130     SK_MEMBER_PROPERTY(posts, Boolean),
131     SK_MEMBER_PROPERTY(script, String)
132 };
133 
134 #endif
135 
136 DEFINE_GET_MEMBER(SkDump);
137 
enable(SkAnimateMaker &)138 bool SkDump::enable(SkAnimateMaker&) {
139     return true;
140 }
141 
hasEnable() const142 bool SkDump::hasEnable() const {
143     return true;
144 }
145 
setProperty(int index,SkScriptValue &)146 bool SkDump::setProperty(int index, SkScriptValue&) {
147     return index <= SK_PROPERTY(posts);
148 }
149 
150 #endif
151