More turtles
[ipdf/code.git] / src / debugscript.cpp
1 #include "debugscript.h"
2
3 #include <string>
4
5 using namespace IPDF;
6
7 void DebugScript::ParseAction()
8 {
9         std::string actionType;
10         inp >> actionType;
11         // Skip comments
12         while (actionType[0] == '#')
13         {
14                 std::string tmp;
15                 std::getline(inp, tmp);
16                 inp >> std::ws >> actionType;
17         }
18         if (actionType == "loop")
19         {
20                 inp >> currentAction.loops >> actionType;
21         }
22         else
23         {
24                 currentAction.loops = 1;
25         }
26
27         if (actionType == "wait")
28         {
29                 currentAction.type = AT_WaitFrame;
30                 return;
31         }
32         else if (actionType == "translate")
33         {
34                 std::string _x, _y;
35                 inp >> _x >> _y;
36                 currentAction.type = AT_Translate;
37                 currentAction.x = RealFromStr(_x.c_str());
38                 currentAction.y = RealFromStr(_y.c_str());
39                 return;
40         }
41         else if (actionType == "zoom")
42         {
43                 std::string _x, _y, _z;
44                 inp >> _x >> _y >> _z;
45                 currentAction.type = AT_Zoom;
46                 currentAction.x = RealFromStr(_x.c_str());
47                 currentAction.y = RealFromStr(_y.c_str());
48                 currentAction.z = RealFromStr(_z.c_str());
49         }
50         else if (actionType == "pxtranslate")
51         {
52                 inp >> currentAction.ix >> currentAction.iy;
53                 currentAction.type = AT_TranslatePx;
54         }
55         else if (actionType == "pxzoom")
56         {
57                 inp >> currentAction.ix >> currentAction.iy >> currentAction.iz;
58                 currentAction.type = AT_ZoomPx;
59         }
60         else if (actionType == "gpu")
61         {
62                 currentAction.type = AT_SetGPURendering;
63         }
64         else if (actionType == "cpu")
65         {
66                 currentAction.type = AT_SetCPURendering;
67         }
68         else if (actionType == "lazy")
69         {
70                 currentAction.type = AT_EnableLazyRendering;
71         }
72         else if (actionType == "nolazy")
73         {
74                 currentAction.type = AT_DisableLazyRendering;
75         }
76         else if (actionType == "quit")
77         {
78                 currentAction.type = AT_Quit;
79         }
80         else if (actionType == "loadsvg")
81         {
82                 currentAction.type = AT_LoadSVG;
83                 inp >> currentAction.textargs;
84         }
85         else if (actionType == "label")
86         {
87                 currentAction.type = AT_Label;
88                 inp >> currentAction.textargs;
89         }
90         else if (actionType == "goto")
91         {
92                 currentAction.type = AT_Goto;
93                 inp >> currentAction.textargs;
94         }
95         else if (actionType == "debug")
96         {
97                 currentAction.type = AT_Debug;
98                 getline(inp,currentAction.textargs);
99         }
100         else if (actionType == "clear")
101         {
102                 currentAction.type = AT_ClearDocument;
103         }
104         else if (actionType == "clearperf")
105         {
106                 currentAction.type = AT_ClearPerformance;
107         }
108         else if (actionType == "printperf")
109         {
110                 currentAction.type = AT_PrintPerformance;
111         }
112         else if (actionType == "recordperf")
113         {
114                 currentAction.type = AT_RecordPerformance;
115         }
116         else if (actionType == "debugfont")
117         {
118                 currentAction.type = AT_DebugFont;
119                 inp >> currentAction.textargs;
120         }
121
122 }
123
124 bool DebugScript::Execute(View *view, Screen *scr)
125 {
126         if (currentAction.loops <= 0)
127         {
128                 if (m_index >= m_actions.size())
129                 {
130                         ParseAction();
131                         if (m_labels.size() > 0)
132                         {
133                                 m_actions.push_back(currentAction);
134                                 m_index++;
135                         }
136                                 
137                 }
138                 else
139                         currentAction = m_actions[m_index++];
140         }
141
142         switch(currentAction.type)
143         {
144         case AT_Quit:
145                 return true;
146         case AT_WaitFrame:
147                 break;
148         case AT_Translate:
149                 view->Translate(currentAction.x, currentAction.y);
150                 break;
151         case AT_TranslatePx:
152                 view->Translate(Real(currentAction.ix)/Real(scr->ViewportWidth()), Real(currentAction.iy)/Real(scr->ViewportHeight()));
153                 break;
154         case AT_Zoom:
155                 view->ScaleAroundPoint(currentAction.x, currentAction.y, currentAction.z);
156                 break;
157         case AT_ZoomPx:
158                 view->ScaleAroundPoint(Real(currentAction.ix)/Real(scr->ViewportWidth()),Real(currentAction.iy)/Real(scr->ViewportHeight()), Real(expf(-currentAction.iz/20.f)));
159                 break;
160         case AT_SetGPURendering:
161                 view->SetGPURendering(true);
162                 break;
163         case AT_SetCPURendering:
164                 view->SetGPURendering(false);
165                 break;
166         case AT_EnableLazyRendering:
167                 view->SetLazyRendering(true);
168                 break;
169         case AT_DisableLazyRendering:
170                 view->SetLazyRendering(false);
171                 break;
172         case AT_LoadSVG:
173         {
174                 #ifdef TRANSFORM_OBJECTS_NOT_VIEW
175                         view->Doc().LoadSVG(currentAction.textargs, Rect(Real(1)/Real(2),Real(1)/Real(2),Real(1)/Real(800),Real(1)/Real(600))); 
176                 #else
177                         const Rect & bounds = view->GetBounds();
178                         view->Doc().LoadSVG(currentAction.textargs, Rect(bounds.x+bounds.w/Real(2),bounds.y+bounds.h/Real(2),bounds.w/Real(800),bounds.h/Real(600)));
179                 #endif
180                 currentAction.type = AT_WaitFrame;
181                 view->ForceRenderDirty();
182                 view->ForceBufferDirty();
183                 view->ForceBoundsDirty();
184                 currentAction.loops = 1;
185                 break;
186         }
187         case AT_Label:
188                 m_labels[currentAction.textargs] = m_index;
189                 currentAction.type = AT_WaitFrame;
190                 currentAction.loops = 1;
191                 break;
192         case AT_Goto:
193                 m_index = m_labels[currentAction.textargs];
194                 currentAction.loops = 1;
195                 break;
196         case AT_Debug:
197                 Debug("View bounds: %s", view->GetBounds().Str().c_str());
198                 if (currentAction.textargs.size() > 0)
199                         Debug("%s", currentAction.textargs.c_str());
200                 break;
201         case AT_ClearDocument:
202                 view->Doc().ClearObjects();
203                 currentAction.loops = 1;
204                 break;
205         case AT_ClearPerformance:
206                 ClearPerformance(view, scr);
207                 currentAction.loops = 1;
208                 break;
209         case AT_PrintPerformance:
210                 PrintPerformance(view, scr);
211                 currentAction.loops = 1;        
212                 break;
213         case AT_RecordPerformance:
214                 PrintPerformance(view, scr);
215                 break;
216         case AT_DebugFont:
217                 scr->ShowDebugFont(currentAction.textargs == "1" || currentAction.textargs == "on");
218                 currentAction.loops = 1;
219                 break;
220         default:
221                 Fatal("Unknown script command in queue.");
222         }
223         currentAction.loops--;
224         return false;
225 }
226
227 void DebugScript::ClearPerformance(View * view, Screen * scr)
228 {
229         m_perf_start.clock = clock();
230         m_perf_start.object_count = view->Doc().ObjectCount();
231         m_perf_start.view_bounds = view->GetBounds();
232         m_perf_last = m_perf_start;
233 }
234
235 void DebugScript::PrintPerformance(View * view, Screen * scr)
236 {
237         DebugScript::PerformanceData now;
238         now.clock = clock();
239         now.object_count = view->Doc().ObjectCount();
240         now.view_bounds = view->GetBounds();
241
242         // object_count  clock  delta_clock  x  Log10(x)  y  Log10(y)  w  Log10(w)  Size(w)
243         printf("%d\t%lu\t%lu\t%s\t%f\t%s\t%f\t%s\t%f\t%lu\n",
244                 now.object_count, (uint64_t)now.clock,
245                 (uint64_t)(now.clock - m_perf_last.clock),
246                 Str(now.view_bounds.x).c_str(), Log10(Abs(now.view_bounds.x)),
247                 Str(now.view_bounds.y).c_str(), Log10(Abs(now.view_bounds.y)),
248                 Str(now.view_bounds.w).c_str(), Log10(now.view_bounds.w),
249                 Size(now.view_bounds.w));
250         m_perf_last = now;
251 }

UCC git Repository :: git.ucc.asn.au