summaryrefslogtreecommitdiff
path: root/externals/microprofile/microprofile_html.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--externals/microprofile/microprofile_html.h3868
1 files changed, 3868 insertions, 0 deletions
diff --git a/externals/microprofile/microprofile_html.h b/externals/microprofile/microprofile_html.h
new file mode 100644
index 000000000..01b624b60
--- /dev/null
+++ b/externals/microprofile/microprofile_html.h
@@ -0,0 +1,3868 @@
1///start file generated from microprofile.html
2#ifdef MICROPROFILE_EMBED_HTML
3const char g_MicroProfileHtml_begin_0[] =
4"<!DOCTYPE HTML>\n"
5"<html>\n"
6"<head>\n"
7"<title>MicroProfile Capture</title>\n"
8"<style>\n"
9"/* about css: http://bit.ly/1eMQ42U */\n"
10"body {margin: 0px;padding: 0px; font: 12px Courier New;background-color:#474747; color:white;overflow:hidden;}\n"
11"ul {list-style-type: none;margin: 0;padding: 0;}\n"
12"li{display: inline; float:left;border:5px; position:relative;text-align:center;}\n"
13"a {\n"
14" float:left;\n"
15" text-decoration:none;\n"
16" display: inline;\n"
17" text-align: center;\n"
18" padding:5px;\n"
19" padding-bottom:0px;\n"
20" padding-top:0px;\n"
21" color: #FFFFFF;\n"
22" background-color: #474747;\n"
23"}\n"
24"a:hover, a:active{\n"
25" background-color: #000000;\n"
26"}\n"
27"\n"
28"ul ul {\n"
29" position:absolute;\n"
30" left:0;\n"
31" top:100%;\n"
32" margin-left:-999em;\n"
33"}\n"
34"li:hover ul {\n"
35" margin-left:0;\n"
36" margin-right:0;\n"
37"}\n"
38"ul li ul{ display:block;float:none;width:100%;}\n"
39"ul li ul li{ display:block;float:none;width:100%;}\n"
40"li li a{ display:block;float:none;width:100%;text-align:left;}\n"
41"#nav li:hover div {margin-left:0;}\n"
42".help {position:absolute;z-index:5;text-align:left;padding:2px;margin-left:-999em;background-color: #313131;width:300px;}\n"
43".helpstart {position:absolute;z-index:5;text-align:left;padding:2px;background-color: #313131;width:300px;display:none}\n"
44".root {z-index:1;position:absolute;top:0px;left:0px;}\n"
45"</style>\n"
46"</head>\n"
47"<body style=\"\">\n"
48"<canvas id=\"History\" height=\"70\" style=\"background-color:#474747;margin:0px;padding:0px;\"></canvas><canvas id=\"DetailedView\" height=\"200\" style=\"background-color:#474747;margin:0px;padding:0px;\"></canvas>\n"
49"<div id=\"root\" class=\"root\">\n"
50"<ul id=\"nav\">\n"
51"<li><a href=\"javascript:void(0)\" onclick=\"ToggleDebugMode();\">?</a>\n"
52"<div class=\"helpstart\" id=\"helpwindow\" style=\"left:20px;top:20px\">\n"
53"History View:<br>\n"
54"Click + Drag: Pan View<br>\n"
55"Right Click + Drag : Zoom on region<br>\n"
56"Click Frame : Center on frame<br>\n"
57"<hr>\n"
58"Main View:<br>\n"
59"Ctrl + Mouse up/down: Zoom<br>\n"
60"Mousewheel : Zoom<br>\n"
61"Right Click + Drag: Zoom to region<br>\n"
62"Ctrl + Drag: Pan<br>\n"
63"Click + Drag: Pan<br>\n"
64"<hr>\n"
65"<table style=\"width:100%\">\n"
66"<tr>\n"
67"<td width=\"50%\" align=\"left\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 0);\">Close</a></td>\n"
68"<td width=\"50%\" align=\"right\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 1);\">Close, Never Show</a></td>\n"
69"</tr>\n"
70"</table>\n"
71"</div>\n"
72"<div class=\"help\" id=\"divFrameInfo\" style=\"left:20px;top:300px;width:auto;\">\n"
73"</div>\n"
74"</li>\n"
75"<li><a id=\'ModeSubMenuText\'>Mode</a>\n"
76" <ul id=\'ModeSubMenu\'>\n"
77" <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 0);\" id=\"buttonTimers\">Timers</a></li>\n"
78" <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 1);\" id=\"buttonGroups\">Groups</a></li> \n"
79" <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 2);\" id=\"buttonThreads\">Threads</a></li>\n"
80" <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'detailed\', 0);\" id=\"buttonDetailed\">Detailed</a></li>\n"
81" </ul>\n"
82"</li>\n"
83"<li><a>Reference</a>\n"
84" <ul id=\'ReferenceSubMenu\'>\n"
85" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'5ms\');\">5ms</a></li>\n"
86" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'10ms\');\">10ms</a></li>\n"
87" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'15ms\');\">15ms</a></li>\n"
88" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'20ms\');\">20ms</a></li>\n"
89" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'33ms\');\">33ms</a></li>\n"
90" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'50ms\');\">50ms</a></li>\n"
91" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'100ms\');\">100ms</a></li>\n"
92" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'250ms\');\">250ms</a></li>\n"
93" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'500ms\');\">500ms</a></li>\n"
94" <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'1000ms\');\">1000ms</a></li>\n"
95" </ul>\n"
96"</li>\n"
97"<li id=\"ilThreads\"><a>Threads</a>\n"
98" <ul id=\"ThreadSubMenu\">\n"
99" <li><a href=\"javascript:void(0)\" onclick=\"ToggleThread();\">All</a></li>\n"
100" <li><a>---</a></li>\n"
101" </ul>\n"
102"</li>\n"
103"<li id=\"ilGroups\"><a>Groups</a>\n"
104" <ul id=\"GroupSubMenu\">\n"
105" <li><a href=\"javascript:void(0)\" onclick=\"ToggleGroup();\">All</a></li>\n"
106" <li><a>---</a></li>\n"
107" </ul>\n"
108"</li>\n"
109"<li id=\"ilOptions\"><a>Options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>\n"
110" <ul id=\'OptionsMenu\'>\n"
111" <li><a href=\"javascript:void(0)\" onclick=\"ToggleContextSwitch();\">Context Switch</a></li>\n"
112" <li><a href=\"javascript:void(0)\" onclick=\"ToggleDisableMerge();\">MergeDisable</a></li>\n"
113" <li><a href=\"javascript:void(0)\" onclick=\"ToggleDisableLod();\">LodDisable</a></li>\n"
114" <li id=\'GroupColors\'><a href=\"javascript:void(0)\" onclick=\"ToggleGroupColors();\">Group Colors</a></li>\n"
115" <li id=\'TimersMeta\'><a href=\"javascript:void(0)\" onclick=\"ToggleTimersMeta();\">Meta</a></li>\n"
116" <li id=\'ShowHelp\'><a href=\"javascript:void(0)\" onclick=\"ShowHelp(1,1);\">Help</a></li>\n"
117"<!-- <li><a href=\"javascript:void(0)\" onclick=\"ToggleDebug();\">DEBUG</a></li> -->\n"
118" </ul>\n"
119"</li>\n"
120"</ul>\n"
121"</div>\n"
122"<script>\n"
123"function InvertColor(hexTripletColor) {\n"
124" var color = hexTripletColor;\n"
125" color = color.substring(1); // remove #\n"
126" color = parseInt(color, 16); // convert to integer\n"
127" var R = ((color >> 16) % 256)/255.0;\n"
128" var G = ((color >> 8) % 256)/255.0;\n"
129" var B = ((color >> 0) % 256)/255.0;\n"
130" var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n"
131" if(lum < 0.7)\n"
132" {\n"
133" return \'#ffffff\';\n"
134" }\n"
135" else\n"
136" {\n"
137" return \'#333333\';\n"
138" }\n"
139"}\n"
140"function InvertColorIndex(hexTripletColor) {\n"
141" var color = hexTripletColor;\n"
142" color = color.substring(1); // remove #\n"
143" color = parseInt(color, 16); // convert to integer\n"
144" var R = ((color >> 16) % 256)/255.0;\n"
145" var G = ((color >> 8) % 256)/255.0;\n"
146" var B = ((color >> 0) % 256)/255.0;\n"
147" var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n"
148" if(lum < 0.7)\n"
149" {\n"
150" return 0;\n"
151" }\n"
152" else\n"
153" {\n"
154" return 1;\n"
155" }\n"
156"}\n"
157"function MakeGroup(id, name, category, numtimers, isgpu, total, average, max, color)\n"
158"{\n"
159" var group = {\"id\":id, \"name\":name, \"category\":category, \"numtimers\":numtimers, \"isgpu\":isgpu, \"total\": total, \"average\" : average, \"max\" : max, \"color\":color};\n"
160" return group;\n"
161"}\n"
162"\n"
163"function MakeTimer(id, name, group, color, colordark, average, max, exclaverage, exclmax, callaverage, callcount, total, meta, metaavg, metamax)\n"
164"{\n"
165" var timer = {\"id\":id, \"name\":name, \"len\":name.length, \"color\":color, \"colordark\":colordark,\"timercolor\":color, \"textcolor\":InvertColor(color), \"group\":group, \"average\":average, \"max\":max, \"exclaverage\":exclaverage, \"exclmax\":exclmax, \"callaverage\":callaverage, \"callcount\":callcount, \"total\":total, \"meta\":meta, \"textcolorindex\":InvertColorIndex(color), \"metaavg\":metaavg, \"metamax\":metamax};\n"
166" return timer;\n"
167"}\n"
168"function MakeFrame(id, framestart, frameend, framestartgpu, frameendgpu, ts, tt, ti)\n"
169"{\n"
170" var frame = {\"id\":id, \"framestart\":framestart, \"frameend\":frameend, \"framestartgpu\":framestartgpu, \"frameendgpu\":frameendgpu, \"ts\":ts, \"tt\":tt, \"ti\":ti};\n"
171" return frame;\n"
172"}\n"
173"\n"
174"";
175
176const size_t g_MicroProfileHtml_begin_0_size = sizeof(g_MicroProfileHtml_begin_0);
177const char* g_MicroProfileHtml_begin[] = {
178&g_MicroProfileHtml_begin_0[0],
179};
180size_t g_MicroProfileHtml_begin_sizes[] = {
181sizeof(g_MicroProfileHtml_begin_0),
182};
183size_t g_MicroProfileHtml_begin_count = 1;
184const char g_MicroProfileHtml_end_0[] =
185"\n"
186"\n"
187"\n"
188"var CanvasDetailedView = document.getElementById(\'DetailedView\');\n"
189"var CanvasHistory = document.getElementById(\'History\');\n"
190"var CanvasDetailedOffscreen = document.createElement(\'canvas\');\n"
191"var g_Msg = \'0\';\n"
192"\n"
193"var Initialized = 0;\n"
194"var fDetailedOffset = Frames[0].framestart;\n"
195"var fDetailedRange = Frames[0].frameend - fDetailedOffset;\n"
196"var nWidth = CanvasDetailedView.width;\n"
197"var nHeight = CanvasDetailedView.height;\n"
198"var ReferenceTime = 33;\n"
199"var nHistoryHeight = 70;\n"
200"var nOffsetY = 0;\n"
201"var nOffsetBarsX = 0;\n"
202"var nOffsetBarsY = 0;\n"
203"var nBarsWidth = 80;\n"
204"var NameWidth = 200;\n"
205"var MouseButtonState = [0,0,0,0,0,0,0,0];\n"
206"var KeyShiftDown = 0;\n"
207"var MouseDragButton = 0;\n"
208"var KeyCtrlDown = 0;\n"
209"var FlipToolTip = 0;\n"
210"var DetailedViewMouseX = 0;\n"
211"var DetailedViewMouseY = 0;\n"
212"var HistoryViewMouseX = -1;\n"
213"var HistoryViewMouseY = -1;\n"
214"var MouseHistory = 0;\n"
215"var MouseDetailed = 0;\n"
216"var FontHeight = 10;\n"
217"var FontWidth = 1;\n"
218"var FontAscent = 3; //Set manually\n"
219"var Font = \'Bold \' + FontHeight + \'px Courier New\';\n"
220"var FontFlash = \'Bold \' + 35 + \'px Courier New\';\n"
221"var BoxHeight = FontHeight + 2;\n"
222"var ThreadsActive = new Object();\n"
223"var ThreadsAllActive = 1;\n"
224"var GroupsActive = new Object();\n"
225"var GroupsAllActive = 1;\n"
226"var nMinWidth = 0.01;//subpixel width\n"
227"var nMinWidthPan = 1.0;//subpixel width when panning\n"
228"var nContextSwitchEnabled = 1;\n"
229"var DisableLod = 0;\n"
230"var DisableMerge = 0;\n"
231"var GroupColors = 0;\n"
232"var nModDown = 0;\n"
233"var g_MSG = \'no\';\n"
234"var nDrawCount = 0;\n"
235"var nBackColors = [\'#474747\', \'#313131\' ];\n"
236"var nBackColorOffset = \'#606060\';\n"
237"var CSwitchColors =[\"#9DD8AF\",\"#D7B6DA\",\"#EAAC76\",\"#DBDA61\",\"#8AD5E1\",\"#8CE48B\",\"#C4D688\",\"#57E5C4\"];//generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php\n"
238"var CSwitchHeight = 5;\n"
239"var FRAME_HISTORY_COLOR_CPU = \'#ff7f27\';\n"
240"var FRAME_HISTORY_COLOR_GPU = \'#ffffff\';\n"
241"var ZOOM_TIME = 0.5;\n"
242"var AnimationActive = false;\n"
243"var nHoverCSCpu = -1;\n"
244"var nHoverCSCpuNext = -1;\n"
245"var nHoverCSToolTip = null;\n"
246"var nHoverToken = -1;\n"
247"var nHoverFrame = -1;\n"
248"var nHoverTokenIndex = -1;\n"
249"var nHoverTokenLogIndex = -1;\n"
250"var nHoverCounter = 0;\n"
251"var nHoverCounterDelta = 8;\n"
252"var nHoverTokenNext = -1;\n"
253"var nHoverTokenLogIndexNext = -1;\n"
254"var nHoverTokenIndexNext = -1;\n"
255"var nHideHelp = 0;\n"
256"\n"
257"\n"
258"var fFrameScale = 33.33;\n"
259"var fRangeBegin = 0;\n"
260"var fRangeEnd = -1;\n"
261"var fRangeBeginNext = 0;\n"
262"var fRangeEndNext = 0;\n"
263"var fRangeBeginGpuNext = 0;\n"
264"var fRangeEndGpuNext = 0;\n"
265"var fRangeBeginHistory = -1;\n"
266"var fRangeEndHistory = -1;\n"
267"var fRangeBeginHistoryGpu = -1;\n"
268"var fRangeEndHistoryGpu = -1;\n"
269"var fRangeBeginSelect = 0;\n"
270"var fRangeEndSelect = -1;\n"
271"\n"
272"var ModeDetailed = 0;\n"
273"var ModeTimers = 1;\n"
274"var Mode = ModeDetailed;\n"
275"\n"
276"var DebugDrawQuadCount = 0;\n"
277"var DebugDrawTextCount = 0;\n"
278"var ProfileMode = 0;\n"
279"var ProfileFps = 0;\n"
280"var ProfileFpsAggr = 0;\n"
281"var ProfileFpsCount = 0;\n"
282"var ProfileLastTimeStamp = new Date();\n"
283"\n"
284"var CSwitchCache = {};\n"
285"var CSwitchOnlyThreads = [];\n"
286"var ProfileData = {};\n"
287"var ProfileStackTime = {};\n"
288"var ProfileStackName = {};\n"
289"var Debug = 1;\n"
290"\n"
291"var g_MaxStack = Array();\n"
292"var g_TypeArray;\n"
293"var g_TimeArray;\n"
294"var g_IndexArray;\n"
295"var LodData = new Array();\n"
296"var NumLodSplits = 10;\n"
297"var SplitMin = 100;\n"
298"var SPLIT_LIMIT = 1e20;\n"
299"var DPR = 1;\n"
300"var DetailedRedrawState = {};\n"
301"var OffscreenData;\n"
302"var DetailedFrameCounter = 0;\n"
303"var Invalidate = 0;\n"
304"var GroupOrder = Array();\n"
305"var ThreadOrder = Array();\n"
306"var TimersGroups = 0;\n"
307"var TimersMeta = 1;\n"
308"var MetaLengths = Array();\n"
309"var MetaLengthsAvg = Array();\n"
310"var MetaLengthsMax = Array();\n"
311"\n"
312"\n"
313"function ProfileModeClear()\n"
314"{\n"
315" if(ProfileMode)\n"
316" {\n"
317" ProfileData = new Object();\n"
318" ProfileStackTime = new Array();\n"
319" ProfileStackName = new Array();\n"
320" }\n"
321"}\n"
322"function ProfileEnter(Name)\n"
323"{\n"
324" if(ProfileMode)\n"
325" {\n"
326" ProfileStackTime.push(new Date());\n"
327" ProfileStackName.push(Name);\n"
328" }\n"
329"}\n"
330"function ProfileLeave()\n"
331"{\n"
332" if(ProfileMode)\n"
333" {\n"
334" var Time = new Date();\n"
335" var Delta = Time - ProfileStackTime.pop();\n"
336" var Name = ProfileStackName.pop();\n"
337" var Obj = ProfileData[Name];\n"
338" if(!Obj)\n"
339" {\n"
340" Obj = new Object();\n"
341" Obj.Count = 0;\n"
342" Obj.Name = Name;\n"
343" Obj.Time = 0;\n"
344" ProfileData[Name] = Obj;\n"
345" }\n"
346" Obj.Time += Delta;\n"
347" Obj.Count += 1;\n"
348" }\n"
349"}\n"
350"\n"
351"function ProfilePlot(s)\n"
352"{\n"
353" if(ProfileMode)\n"
354" {\n"
355" var A = ProfileData.Plot;\n"
356" if(!A)\n"
357" {\n"
358" ProfileData.Plot = Array();\n"
359" A = ProfileData.Plot;\n"
360" }\n"
361" if(A.length<10)\n"
362" {\n"
363" A.push(s);\n"
364" }\n"
365" }\n"
366"}\n"
367"function ProfileModeDump()\n"
368"{\n"
369" for(var idx in ProfileData)\n"
370" {\n"
371" var Timer = ProfileData[idx];\n"
372" console.log(Timer.Name + \" \" + Timer.Time + \"ms \" + Timer.Count);\n"
373" }\n"
374"\n"
375"}\n"
376"function ProfileModeDraw(Canvas)\n"
377"{\n"
378" if(ProfileMode)\n"
379" {\n"
380" var StringArray = [];\n"
381" for(var idx in ProfileData)\n"
382" {\n"
383" if(idx == \"Plot\")\n"
384" continue;\n"
385" var Timer = ProfileData[idx];\n"
386" StringArray.push(Timer.Name);\n"
387" StringArray.push(Timer.Time + \"ms\");\n"
388" StringArray.push(\"#\");\n"
389" StringArray.push(\"\" + Timer.Count);\n"
390" }\n"
391" StringArray.push(\"debug\");\n"
392" StringArray.push(Debug);\n"
393" var Time = new Date();\n"
394" var Delta = Time - ProfileLastTimeStamp;\n"
395" ProfileLastTimeStamp = Time;\n"
396" StringArray.push(\"Frame Delta\");\n"
397" StringArray.push(Delta + \"ms\");\n"
398" if(ProfileMode == 2)\n"
399" {\n"
400" ProfileFpsAggr += Delta;\n"
401" ProfileFpsCount ++ ;\n"
402" var AggrFrames = 10;\n"
403" if(ProfileFpsCount == AggrFrames)\n"
404" {\n"
405" ProfileFps = 1000 / (ProfileFpsAggr / AggrFrames);\n"
406" ProfileFpsAggr = 0;\n"
407" ProfileFpsCount = 0;\n"
408" }\n"
409" StringArray.push(\"FPS\");\n"
410" StringArray.push(\"\" + ProfileFps.toFixed(2));\n"
411" }\n"
412"\n"
413"\n"
414" for(var i = 0; i < ProfileData.Plot; ++i)\n"
415" {\n"
416" StringArray.push(\"\");\n"
417" StringArray.push(ProfileData.Plot[i]);\n"
418" }\n"
419" ProfileData.Plot = Array();\n"
420" DrawToolTip(StringArray, Canvas, 0, 200);\n"
421" }\n"
422"}\n"
423"\n"
424"function ToggleDebugMode()\n"
425"{\n"
426" ProfileMode = (ProfileMode+1)%4;\n"
427" console.log(\'Toggle Debug Mode \' + ProfileMode);\n"
428"}\n"
429"\n"
430"function DetailedTotal()\n"
431"{\n"
432" var Total = 0;\n"
433" for(var i = 0; i < Frames.length; i++)\n"
434" {\n"
435" var frfr = Frames[i];\n"
436" Total += frfr.frameend - frfr.framestart;\n"
437" }\n"
438" return Total;\n"
439"}\n"
440"\n"
441"function InitFrameInfo()\n"
442"{\n"
443"\n"
444" var div = document.getElementById(\'divFrameInfo\');\n"
445" var txt = \'\';\n"
446" txt = txt + \'Timers View\' + \'<br>\';\n"
447" txt = txt + \'Frames:\' + AggregateInfo.Frames +\'<br>\';\n"
448" txt = txt + \'Time:\' + AggregateInfo.Time.toFixed(2) +\'ms<br>\';\n"
449" txt = txt + \'<hr>\';\n"
450" txt = txt + \'Detailed View\' + \'<br>\';\n"
451" txt = txt + \'Frames:\' + Frames.length +\'<br>\';\n"
452" txt = txt + \'Time:\' + DetailedTotal().toFixed(2) +\'ms<br>\';\n"
453" div.innerHTML = txt;\n"
454"}\n"
455"function InitGroups()\n"
456"{\n"
457" for(groupid in GroupInfo)\n"
458" {\n"
459" var TimerArray = Array();\n"
460" for(timerid in TimerInfo)\n"
461" {\n"
462" if(TimerInfo[timerid].group == groupid)\n"
463" {\n"
464" TimerArray.push(timerid);\n"
465" }\n"
466" }\n"
467" GroupInfo[groupid].TimerArray = TimerArray;\n"
468" }\n"
469"}\n"
470"\n"
471"function InitThreadMenu()\n"
472"{\n"
473" var ulThreadMenu = document.getElementById(\'ThreadSubMenu\');\n"
474" var MaxLen = 7;\n"
475" ThreadOrder = CreateOrderArray(ThreadNames, function(a){return a;});\n"
476" for(var idx in ThreadOrder)\n"
477" {\n"
478" var name = ThreadNames[ThreadOrder[idx]];\n"
479" var li = document.createElement(\'li\');\n"
480" if(name.length > MaxLen)\n"
481" {\n"
482" MaxLen = name.length;\n"
483" }\n"
484" li.innerText = name;\n"
485" var asText = li.innerHTML;\n"
486" var html = \'<a href=\"javascript:void(0)\" onclick=\"ToggleThread(\\'\' + name + \'\\');\">\' + asText + \'</a>\';\n"
487" li.innerHTML = html;\n"
488" ulThreadMenu.appendChild(li);\n"
489" }\n"
490" var LenStr = (5+(1+MaxLen) * (1+FontWidth)) + \'px\';\n"
491" var Lis = ulThreadMenu.getElementsByTagName(\'li\');\n"
492" for(var i = 0; i < Lis.length; ++i)\n"
493" {\n"
494" Lis[i].style[\'width\'] = LenStr;\n"
495" }\n"
496"}\n"
497"\n"
498"function UpdateThreadMenu()\n"
499"{\n"
500" var ulThreadMenu = document.getElementById(\'ThreadSubMenu\');\n"
501" var as = ulThreadMenu.getElementsByTagName(\'a\');\n"
502" for(var i = 0; i < as.length; ++i)\n"
503" {\n"
504" var elem = as[i];\n"
505" var inner = elem.innerText;\n"
506" var bActive = false;\n"
507" if(i < 2)\n"
508" {\n"
509" if(inner == \'All\')\n"
510" {\n"
511" bActive = ThreadsAllActive;\n"
512" }\n"
513" }\n"
514" else\n"
515" {\n"
516" bActive = ThreadsActive[inner];\n"
517" }\n"
518" if(bActive)\n"
519" {\n"
520" elem.style[\'text-decoration\'] = \'underline\';\n"
521" }\n"
522" else\n"
523" {\n"
524" elem.style[\'text-decoration\'] = \'none\';\n"
525" }\n"
526" }\n"
527"}\n"
528"\n"
529"function ToggleThread(ThreadName)\n"
530"{\n"
531" if(ThreadName)\n"
532" {\n"
533" if(ThreadsActive[ThreadName])\n"
534" {\n"
535" ThreadsActive[ThreadName] = false;\n"
536" }\n"
537" else\n"
538" {\n"
539" ThreadsActive[ThreadName] = true;\n"
540" }\n"
541" }\n"
542" else\n"
543" {\n"
544" if(ThreadsAllActive)\n"
545" {\n"
546" ThreadsAllActive = 0;\n"
547" }\n"
548" else\n"
549" {\n"
550" ThreadsAllActive = 1;\n"
551" }\n"
552" }\n"
553" Invalidate = 0;\n"
554" UpdateThreadMenu();\n"
555" WriteCookie();\n"
556" Draw(1);\n"
557"\n"
558"}\n"
559"\n"
560"function CreateOrderArray(Source, NameFunc)\n"
561"{\n"
562" var Temp = Array(Source.length);\n"
563" for(var i = 0; i < Source.length; ++i)\n"
564" {\n"
565" Temp[i] = {};\n"
566" Temp[i].index = i;\n"
567" Temp[i].namezz = NameFunc(Source[i]).toLowerCase();\n"
568" }\n"
569" Temp.sort(function(l, r)\n"
570" { \n"
571" if(r.namezz<l.namezz)\n"
572" {return 1;}\n"
573" if(l.namezz<r.namezz)\n"
574" {return -1;} \n"
575" return 0;\n"
576" } );\n"
577" var OrderArray = Array(Source.length);\n"
578" for(var i = 0; i < Source.length; ++i)\n"
579" {\n"
580" OrderArray[i] = Temp[i].index;\n"
581" }\n"
582" return OrderArray;\n"
583"}\n"
584"\n"
585"\n"
586"function InitGroupMenu()\n"
587"{\n"
588" var ulGroupMenu = document.getElementById(\'GroupSubMenu\');\n"
589" var MaxLen = 7;\n"
590" var MenuArray = Array();\n"
591" for(var i = 0; i < GroupInfo.length; ++i)\n"
592" {\n"
593" var x = {};\n"
594" x.IsCategory = 0;\n"
595" x.category = GroupInfo[i].category;\n"
596" x.name = GroupInfo[i].name;\n"
597" x.index = i;\n"
598" MenuArray.push(x);\n"
599" }\n"
600" for(var i = 0; i < CategoryInfo.length; ++i)\n"
601" {\n"
602" var x = {};\n"
603" x.IsCategory = 1;\n"
604" x.category = i;\n"
605" x.name = CategoryInfo[i];\n"
606" x.index = i;\n"
607" MenuArray.push(x);\n"
608" }\n"
609" var OrderFunction = function(a){ return a.category + \"__\" + a.name; };\n"
610" var OrderFunctionMenu = function(a){ return a.IsCategory ? (a.category + \'\') : (a.category + \"__\" + a.name); };\n"
611" GroupOrder = CreateOrderArray(GroupInfo, OrderFunction);\n"
612" var MenuOrder = CreateOrderArray(MenuArray, OrderFunctionMenu);\n"
613"\n"
614" for(var idx in MenuOrder)\n"
615" {\n"
616" var MenuItem = MenuArray[MenuOrder[idx]];\n"
617" var name = MenuItem.name;\n"
618" var li = document.createElement(\'li\');\n"
619" if(name.length > MaxLen)\n"
620" {\n"
621" MaxLen = name.length;\n"
622" }\n"
623" var jsfunc = \'\';\n"
624" if(MenuItem.IsCategory)\n"
625" { \n"
626" li.innerText = \'[\' + name + \']\';\n"
627" jsfunc = \"ToggleCategory\";\n"
628" }\n"
629" else\n"
630" {\n"
631" li.innerText = name;\n"
632" jsfunc = \"ToggleGroup\";\n"
633" }\n"
634" var asText = li.innerHTML;\n"
635" var html = \'<a href=\"javascript:void(0)\" onclick=\"\' + jsfunc + \'(\\'\' + name + \'\\');\">\' + asText + \'</a>\';\n"
636" li.innerHTML = html;\n"
637" ulGroupMenu.appendChild(li);\n"
638" }\n"
639" var LenStr = (5+(1+MaxLen) * FontWidth) + \'px\';\n"
640" var Lis = ulGroupMenu.getElementsByTagName(\'li\');\n"
641" for(var i = 0; i < Lis.length; ++i)\n"
642" {\n"
643" Lis[i].style[\'width\'] = LenStr;\n"
644" }\n"
645" UpdateGroupMenu();\n"
646"}\n"
647"\n"
648"function UpdateGroupMenu()\n"
649"{\n"
650" var ulThreadMenu = document.getElementById(\'GroupSubMenu\');\n"
651" var as = ulThreadMenu.getElementsByTagName(\'a\');\n"
652" for(var i = 0; i < as.length; ++i)\n"
653" {\n"
654" var elem = as[i];\n"
655" var inner = elem.innerText;\n"
656" var bActive = false;\n"
657" if(i < 2)\n"
658" {\n"
659" if(inner == \'All\')\n"
660" {\n"
661" bActive = GroupsAllActive;\n"
662" }\n"
663" }\n"
664" else\n"
665" {\n"
666" var CategoryString = inner.length>2 ? inner.substring(1, inner.length-2) : \"\";\n"
667" var CategoryIdx = CategoryIndex(CategoryString);\n"
668" if(inner[0] == \'[\' && inner[inner.length-1] == \']\' && CategoryIdx >= 0)\n"
669" {\n"
670" bActive = IsCategoryActive(CategoryIdx);\n"
671" }\n"
672" else\n"
673" {\n"
674" bActive = GroupsActive[inner];\n"
675" }\n"
676" }\n"
677" if(bActive)\n"
678" {\n"
679" elem.style[\'text-decoration\'] = \'underline\';\n"
680" }\n"
681" else\n"
682" {\n"
683" elem.style[\'text-decoration\'] = \'none\';\n"
684" }\n"
685" }\n"
686"}\n"
687"function CategoryIndex(CategoryName)\n"
688"{\n"
689" for(var i = 0; i < CategoryInfo.length; ++i)\n"
690" {\n"
691" if(CategoryInfo[i] == CategoryName)\n"
692" {\n"
693" return i;\n"
694" }\n"
695" }\n"
696" return -1;\n"
697"}\n"
698"function IsCategoryActive(CategoryIdx)\n"
699"{\n"
700" for(var i = 0; i < GroupInfo.length; ++i)\n"
701" {\n"
702" if(GroupInfo[i].category == CategoryIdx)\n"
703" {\n"
704" var Name = GroupInfo[i].name;\n"
705" if(!GroupsActive[Name])\n"
706" {\n"
707" return false;\n"
708" }\n"
709" }\n"
710" }\n"
711" return true;\n"
712"\n"
713"}\n"
714"function ToggleCategory(CategoryName)\n"
715"{\n"
716" var CategoryIdx = CategoryIndex(CategoryName);\n"
717" if(CategoryIdx < 0)\n"
718" return;\n"
719" var CategoryActive = IsCategoryActive(CategoryIdx);\n"
720" for(var i = 0; i < GroupInfo.length; ++i)\n"
721" {\n"
722" if(GroupInfo[i].category == CategoryIdx)\n"
723" {\n"
724" var Name = GroupInfo[i].name;\n"
725" if(CategoryActive)\n"
726" {\n"
727" GroupsActive[Name] = false;\n"
728" }\n"
729" else\n"
730" {\n"
731" GroupsActive[Name] = true;\n"
732" }\n"
733" }\n"
734" }\n"
735" UpdateGroupMenu();\n"
736" WriteCookie();\n"
737" RequestRedraw();\n"
738"}\n"
739"\n"
740"function ToggleGroup(GroupName)\n"
741"{\n"
742" if(GroupName)\n"
743" {\n"
744" if(GroupsActive[GroupName])\n"
745" {\n"
746" GroupsActive[GroupName] = false;\n"
747" }\n"
748" else\n"
749" {\n"
750" GroupsActive[GroupName] = true;\n"
751" }\n"
752" }\n"
753" else\n"
754" {\n"
755" if(GroupsAllActive)\n"
756" {\n"
757" GroupsAllActive = 0;\n"
758" }\n"
759" else\n"
760" {\n"
761" GroupsAllActive = 1;\n"
762" }\n"
763" }\n"
764" UpdateGroupMenu();\n"
765" WriteCookie();\n"
766" RequestRedraw();\n"
767"}\n"
768"function UpdateGroupColors()\n"
769"{\n"
770" for(var i = 0; i < TimerInfo.length; ++i)\n"
771" {\n"
772" if(GroupColors)\n"
773" {\n"
774" TimerInfo[i].color = GroupInfo[TimerInfo[i].group].color;\n"
775" }\n"
776" else\n"
777" {\n"
778" TimerInfo[i].color = TimerInfo[i].timercolor;\n"
779" }\n"
780" TimerInfo[i].textcolorindex = InvertColorIndex(TimerInfo[i].color);\n"
781" }\n"
782"}\n"
783"\n"
784"function ToggleGroupColors()\n"
785"{\n"
786" GroupColors = !GroupColors;\n"
787" UpdateGroupColors();\n"
788" UpdateOptionsMenu();\n"
789" WriteCookie();\n"
790" RequestRedraw();\n"
791"}\n"
792"\n"
793"function UpdateOptionsMenu()\n"
794"{\n"
795" var ulTimersMeta = document.getElementById(\'TimersMeta\');\n"
796" ulTimersMeta.style[\'text-decoration\'] = TimersMeta ? \'underline\' : \'none\';\n"
797" var ulGroupColors = document.getElementById(\'GroupColors\');\n"
798" ulGroupColors.style[\'text-decoration\'] = GroupColors ? \'underline\' : \'none\';\n"
799"}\n"
800"\n"
801"function ToggleTimersMeta()\n"
802"{\n"
803" TimersMeta = TimersMeta ? 0 : 1;\n"
804" WriteCookie();\n"
805" UpdateOptionsMenu();\n"
806" RequestRedraw();\n"
807"}\n"
808"\n"
809"function ShowHelp(Show, Forever)\n"
810"{\n"
811" var HelpWindow = document.getElementById(\'helpwindow\');\n"
812" if(Show)\n"
813" {\n"
814" HelpWindow.style[\'display\'] = \'block\';\n"
815" }\n"
816" else\n"
817" {\n"
818" HelpWindow.style[\'display\'] = \'none\';\n"
819" }\n"
820" if(Forever)\n"
821" {\n"
822" nHideHelp = Show ? 0 : 1;\n"
823" WriteCookie();\n"
824" }\n"
825"}\n"
826"function SetMode(NewMode, Groups)\n"
827"{\n"
828" var buttonTimers = document.getElementById(\'buttonTimers\');\n"
829" var buttonDetailed = document.getElementById(\'buttonDetailed\');\n"
830" var buttonGroups = document.getElementById(\'buttonGroups\');\n"
831" var buttonThreads = document.getElementById(\'buttonThreads\');\n"
832" var ilThreads = document.getElementById(\'ilThreads\');\n"
833" var ilGroups = document.getElementById(\'ilGroups\');\n"
834" var ModeElement = null;\n"
835" if(NewMode == \'timers\' || NewMode == ModeTimers)\n"
836" {\n"
837" TimersGroups = Groups;\n"
838" buttonTimers.style[\'text-decoration\'] = TimersGroups ? \'none\' : \'underline\';\n"
839" buttonGroups.style[\'text-decoration\'] = TimersGroups == 1 ? \'underline\' : \'none\';\n"
840" buttonThreads.style[\'text-decoration\'] = TimersGroups == 2 ? \'underline\' : \'none\';\n"
841" buttonDetailed.style[\'text-decoration\'] = \'none\';\n"
842" if(TimersGroups == 0)\n"
843" {\n"
844" ilThreads.style[\'display\'] = \'none\';\n"
845" }\n"
846" else\n"
847" {\n"
848" ilThreads.style[\'display\'] = \'block\';\n"
849" }\n"
850" ilGroups.style[\'display\'] = \'block\';\n"
851" Mode = ModeTimers;\n"
852" ModeElement = TimersGroups == 2 ? buttonThreads : TimersGroups == 1 ? buttonGroups : buttonTimers;\n"
853" }\n"
854" else if(NewMode == \'detailed\' || NewMode == ModeDetailed)\n"
855" {\n"
856" buttonTimers.style[\'text-decoration\'] = \'none\';\n"
857" buttonGroups.style[\'text-decoration\'] = \'none\';\n"
858" buttonThreads.style[\'text-decoration\'] = \'none\';\n"
859" buttonDetailed.style[\'text-decoration\'] = \'underline\';\n"
860" ilThreads.style[\'display\'] = \'block\';\n"
861" ilGroups.style[\'display\'] = \'none\';\n"
862" Mode = ModeDetailed;\n"
863" ModeElement = buttonDetailed;\n"
864" }\n"
865" var ModeSubMenuText = document.getElementById(\'ModeSubMenuText\');\n"
866" ModeSubMenuText.innerText = \'Mode[\' + ModeElement.innerText + \']\';\n"
867"\n"
868" WriteCookie();\n"
869" RequestRedraw();\n"
870"\n"
871"}\n"
872"\n"
873"function SetReferenceTime(TimeString)\n"
874"{\n"
875" ReferenceTime = parseInt(TimeString);\n"
876" var ReferenceMenu = document.getElementById(\'ReferenceSubMenu\');\n"
877" var Links = ReferenceMenu.getElementsByTagName(\'a\');\n"
878" for(var i = 0; i < Links.length; ++i)\n"
879" {\n"
880" if(Links[i].innerHTML.match(\'^\' + TimeString))\n"
881" {\n"
882" Links[i].style[\'text-decoration\'] = \'underline\';\n"
883" }\n"
884" else\n"
885" {\n"
886" Links[i].style[\'text-decoration\'] = \'none\';\n"
887" }\n"
888" }\n"
889" WriteCookie();\n"
890" RequestRedraw();\n"
891"\n"
892"}\n"
893"\n"
894"function ToggleContextSwitch()\n"
895"{\n"
896" SetContextSwitch(nContextSwitchEnabled ? 0 : 1);\n"
897"}\n"
898"function SetContextSwitch(Enabled)\n"
899"{\n"
900" nContextSwitchEnabled = Enabled ? 1 : 0;\n"
901" var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n"
902" var Links = ReferenceMenu.getElementsByTagName(\'a\');\n"
903" Links[0].style[\'text-decoration\'] = nContextSwitchEnabled ? \'underline\' : \'none\';\n"
904" WriteCookie();\n"
905" RequestRedraw();\n"
906"}\n"
907"\n"
908"function ToggleDebug()\n"
909"{\n"
910" Debug = (Debug + 1) % 2;\n"
911"}\n"
912"\n"
913"function ToggleDisableMerge()\n"
914"{\n"
915" DisableMerge = DisableMerge ? 0 : 1;\n"
916" var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n"
917" var Links = ReferenceMenu.getElementsByTagName(\'a\');\n"
918" if(DisableMerge)\n"
919" {\n"
920" Links[1].style[\'text-decoration\'] = \'underline\';\n"
921" }\n"
922" else\n"
923" {\n"
924" Links[1].style[\'text-decoration\'] = \'none\';\n"
925" }\n"
926"\n"
927"}\n"
928"\n"
929"function ToggleDisableLod()\n"
930"{\n"
931" DisableLod = DisableLod ? 0 : 1;\n"
932" var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n"
933" var Links = ReferenceMenu.getElementsByTagName(\'a\');\n"
934" if(DisableLod)\n"
935" {\n"
936" Links[2].style[\'text-decoration\'] = \'underline\';\n"
937" }\n"
938" else\n"
939" {\n"
940" Links[2].style[\'text-decoration\'] = \'none\';\n"
941" }\n"
942"\n"
943"}\n"
944"\n"
945"function GatherHoverMetaCounters(TimerIndex, StartIndex, nLog, nFrameLast)\n"
946"{\n"
947" var HoverInfo = new Object();\n"
948" var StackPos = 1;\n"
949" //search backwards, count meta counters \n"
950" for(var i = nFrameLast; i >= 0; i--)\n"
951" {\n"
952" var fr = Frames[i];\n"
953" var ts = fr.ts[nLog];\n"
954" var ti = fr.ti[nLog];\n"
955" var tt = fr.tt[nLog];\n"
956" var start = i == nFrameLast ? StartIndex-1 : ts.length-1;\n"
957"\n"
958" for(var j = start; j >= 0; j--)\n"
959" {\n"
960" var type = tt[j];\n"
961" var index = ti[j];\n"
962" var time = ts[j];\n"
963" if(type == 1)\n"
964" {\n"
965" StackPos--;\n"
966" if(StackPos == 0 && index == TimerIndex)\n"
967" {\n"
968" return HoverInfo;\n"
969" }\n"
970" }\n"
971" else if(type == 0)\n"
972" {\n"
973" StackPos++;\n"
974" }\n"
975" else if(type > 3)\n"
976" {\n"
977" var nMetaCount = type - 3;\n"
978" var nMetaIndex = MetaNames[index];\n"
979" if(nMetaIndex in HoverInfo)\n"
980" {\n"
981" HoverInfo[nMetaIndex] += nMetaCount;\n"
982" }\n"
983" else\n"
984" {\n"
985" HoverInfo[nMetaIndex] = nMetaCount;\n"
986" }\n"
987" }\n"
988" }\n"
989" }\n"
990"}\n"
991"function CalculateAllTimers(fBegin, fEnd)\n"
992"{\n"
993" var Sum = [];\n"
994" var Count = [];\n"
995" var Sorted = [];\n"
996" for(var i = 0; i < TimerInfo.length; ++i)\n"
997" {\n"
998" Sum.push(0.0);\n"
999" Count.push(0);\n"
1000" Sorted.push(i);\n"
1001" }\n"
1002" var nFrameFirst = 0;\n"
1003" var nFrameLast = Frames.length;\n"
1004"\n"
1005" var nNumLogs = Frames[0].ts.length;\n"
1006" var StackPosArray = Array(nNumLogs);\n"
1007" var StackArray = Array(nNumLogs);\n"
1008" for(var i = 0; i < nNumLogs; ++i)\n"
1009" {\n"
1010" StackPosArray[i] = 0;\n"
1011" StackArray[i] = Array(20);\n"
1012" }\n"
1013"\n"
1014" for(var i = nFrameFirst; i < nFrameLast; i++)\n"
1015" {\n"
1016" var fr = Frames[i];\n"
1017" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
1018" {\n"
1019" var StackPos = StackPosArray[nLog];\n"
1020" var Stack = StackArray[nLog];\n"
1021" var ts = fr.ts[nLog];\n"
1022" var ti = fr.ti[nLog];\n"
1023" var tt = fr.tt[nLog];\n"
1024" var count = ts.length;\n"
1025" for(j = 0; j < count; j++)\n"
1026" {\n"
1027" var type = tt[j];\n"
1028" var index = ti[j];\n"
1029" var time = ts[j];\n"
1030" if(type == 1 && time < fEnd) //enter\n"
1031" {\n"
1032" Stack[StackPos] = time < fBegin ? fBegin : time;\n"
1033" if(StackArray[nLog][StackPos] != time)\n"
1034" {\n"
1035" console.log(\'fail fail fail\');\n"
1036" }\n"
1037" StackPos++;\n"
1038" }\n"
1039" else if(type == 0) // leave\n"
1040" {\n"
1041" if(StackPos>0)\n"
1042" {\n"
1043" var timeend = time;\n"
1044" StackPos--;\n"
1045" timestart = Stack[StackPos];\n"
1046" var TimeDelta = timeend - timestart;\n"
1047" Sum[index] += TimeDelta;\n"
1048" Count[index]++;\n"
1049" }\n"
1050" }\n"
1051" }\n"
1052" StackPosArray[nLog] = StackPos;\n"
1053" }\n"
1054" }\n"
1055" Sorted.sort(function(a,b){ return Sum[b] - Sum[a]; } );\n"
1056" var Result = {\"Sorted\" : Sorted, \"Sum\" : Sum, \"Count\" : Count};\n"
1057" return Result;\n"
1058"}\n"
1059"function CalculateTimers(Result, TimerIndex, nFrameFirst, nFrameLast)\n"
1060"{\n"
1061" if(!nFrameFirst || nFrameFirst < 0)\n"
1062" nFrameFirst = 0;\n"
1063" if(!nFrameLast || nFrameLast > Frames.length)\n"
1064" nFrameLast = Frames.length;\n"
1065" var FrameCount = nFrameLast - nFrameFirst;\n"
1066" if(0 == FrameCount)\n"
1067" return;\n"
1068" var CallCount = 0;\n"
1069" var Sum = 0;\n"
1070" var Max = 0;\n"
1071" var FrameMax = 0;\n"
1072"\n"
1073" var nNumLogs = Frames[0].ts.length;\n"
1074" var StackPosArray = Array(nNumLogs);\n"
1075" var StackArray = Array(nNumLogs);\n"
1076" for(var i = 0; i < nNumLogs; ++i)\n"
1077" {\n"
1078" StackPosArray[i] = 0;\n"
1079" StackArray[i] = Array(20);\n"
1080" }\n"
1081"\n"
1082" for(var i = nFrameFirst; i < nFrameLast; i++)\n"
1083" {\n"
1084" var FrameSum = 0;\n"
1085" var fr = Frames[i];\n"
1086" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
1087" {\n"
1088" var StackPos = StackPosArray[nLog];\n"
1089" var Stack = StackArray[nLog];\n"
1090" var ts = fr.ts[nLog];\n"
1091" var ti = fr.ti[nLog];\n"
1092" var tt = fr.tt[nLog];\n"
1093" var count = ts.length;\n"
1094" for(j = 0; j < count; j++)\n"
1095" {\n"
1096" var type = tt[j];\n"
1097" var index = ti[j];\n"
1098" var time = ts[j];\n"
1099" if(type == 1) //enter\n"
1100" {\n"
1101" //push\n"
1102" Stack[StackPos] = time;\n"
1103" if(StackArray[nLog][StackPos] != time)\n"
1104" {\n"
1105" console.log(\'fail fail fail\');\n"
1106" }\n"
1107" StackPos++;\n"
1108" }\n"
1109" else if(type == 0) // leave\n"
1110" {\n"
1111" var timestart;\n"
1112" var timeend = time;\n"
1113" if(StackPos>0)\n"
1114" {\n"
1115" StackPos--;\n"
1116" timestart = Stack[StackPos];\n"
1117" }\n"
1118" else\n"
1119" {\n"
1120" timestart = Frames[nFrameFirst].framestart;\n"
1121" }\n"
1122" if(index == TimerIndex)\n"
1123" {\n"
1124" var TimeDelta = timeend - timestart;\n"
1125" CallCount++;\n"
1126" FrameSum += TimeDelta;\n"
1127" Sum += TimeDelta;\n"
1128" if(TimeDelta > Max)\n"
1129" Max = TimeDelta;\n"
1130" }\n"
1131" }\n"
1132" else\n"
1133" {\n"
1134" //meta\n"
1135" }\n"
1136" }\n"
1137" if(FrameSum > FrameMax)\n"
1138" {\n"
1139" FrameMax = FrameSum;\n"
1140" }\n"
1141" StackPosArray[nLog] = StackPos;\n"
1142" }\n"
1143" }\n"
1144"\n"
1145" Result.CallCount = CallCount;\n"
1146" Result.Sum = Sum.toFixed(3);\n"
1147" Result.Max = Max.toFixed(3);\n"
1148" Result.Average = (Sum / CallCount).toFixed(3);\n"
1149" Result.FrameAverage = (Sum / FrameCount).toFixed(3);\n"
1150" Result.FrameCallAverage = (CallCount / FrameCount).toFixed(3);\n"
1151" Result.FrameMax = FrameMax.toFixed(3);\n"
1152" return Result;\n"
1153"}\n"
1154"\n"
1155"function PreprocessCalculateAllTimers()\n"
1156"{\n"
1157" ProfileEnter(\"CalculateAllTimers\");\n"
1158" var nFrameFirst = 0;\n"
1159" var nFrameLast = Frames.length;\n"
1160" var FrameCount = nFrameLast - nFrameFirst;\n"
1161" if(0 == FrameCount)\n"
1162" return;\n"
1163" for(var j = 0; j < TimerInfo.length; j++)\n"
1164" {\n"
1165" TimerInfo[j].CallCount = 0;\n"
1166" TimerInfo[j].Sum = 0;\n"
1167" TimerInfo[j].Max = 0;\n"
1168" TimerInfo[j].FrameMax = 0;\n"
1169" }\n"
1170"\n"
1171"\n"
1172" var nNumLogs = Frames[0].ts.length;\n"
1173" var StackPosArray = Array(nNumLogs);\n"
1174" var StackArray = Array(nNumLogs);\n"
1175" for(var i = 0; i < nNumLogs; ++i)\n"
1176" {\n"
1177" StackPosArray[i] = 0;\n"
1178" StackArray[i] = Array(20);\n"
1179" }\n"
1180"\n"
1181" for(var i = nFrameFirst; i < nFrameLast; i++)\n"
1182" {\n"
1183" for(var j = 0; j < TimerInfo.length; j++)\n"
1184" {\n"
1185" TimerInfo[j].FrameSum = 0;\n"
1186" }\n"
1187"\n"
1188" var fr = Frames[i];\n"
1189" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
1190" {\n"
1191" var StackPos = StackPosArray[nLog];\n"
1192" var Stack = StackArray[nLog];\n"
1193" var ts = fr.ts[nLog];\n"
1194" var ti = fr.ti[nLog];\n"
1195" var tt = fr.tt[nLog];\n"
1196" var count = ts.length;\n"
1197" for(j = 0; j < count; j++)\n"
1198" {\n"
1199" var type = tt[j];\n"
1200" var index = ti[j];\n"
1201" var time = ts[j];\n"
1202" if(type == 1) //enter\n"
1203" {\n"
1204" //push\n"
1205" Stack[StackPos] = time;\n"
1206" if(StackArray[nLog][StackPos] != time)\n"
1207" {\n"
1208" console.log(\'fail fail fail\');\n"
1209" }\n"
1210" StackPos++;\n"
1211" }\n"
1212" else if(type == 0) // leave\n"
1213" {\n"
1214" var timestart;\n"
1215" var timeend = time;\n"
1216" if(StackPos>0)\n"
1217" {\n"
1218" StackPos--;\n"
1219" timestart = Stack[StackPos];\n"
1220" }\n"
1221" else\n"
1222" {\n"
1223" timestart = Frames[nFrameFirst].framestart;\n"
1224" }\n"
1225" // if(index == TimerIndex)\n"
1226" {\n"
1227" var TimeDelta = timeend - timestart;\n"
1228" TimerInfo[index].CallCount++;\n"
1229" TimerInfo[index].FrameSum += TimeDelta;\n"
1230" TimerInfo[index].Sum += TimeDelta;\n"
1231" if(TimeDelta > TimerInfo[index].Max)\n"
1232" TimerInfo[index].Max = TimeDelta;\n"
1233" }\n"
1234" }\n"
1235" else\n"
1236" {\n"
1237" //meta\n"
1238" }\n"
1239" }\n"
1240" for(var j = 0; j < TimerInfo.length; j++)\n"
1241" {\n"
1242" if(TimerInfo[j].FrameSum > TimerInfo[j].FrameMax)\n"
1243" {\n"
1244" TimerInfo[j].FrameMax = TimerInfo[j].FrameSum;\n"
1245" }\n"
1246" }\n"
1247" StackPosArray[nLog] = StackPos;\n"
1248" }\n"
1249"\n"
1250"\n"
1251" }\n"
1252"\n"
1253" for(var j = 0; j < TimerInfo.length; j++)\n"
1254" {\n"
1255" var CallCount = TimerInfo[j].CallCount;\n"
1256" var Sum = TimerInfo[j].Sum.toFixed(3);\n"
1257" var Max = TimerInfo[j].Max.toFixed(3);\n"
1258" var Average = (TimerInfo[j].Sum / TimerInfo[j].CallCount).toFixed(3);\n"
1259" var FrameAverage = (TimerInfo[j].Sum / FrameCount).toFixed(3);\n"
1260" var FrameCallAverage = (TimerInfo[j].CallCount / FrameCount).toFixed(3);\n"
1261" var FrameMax = TimerInfo[j].FrameMax.toFixed(3);\n"
1262" TimerInfo[j].CallCount = CallCount;\n"
1263" TimerInfo[j].Sum = Sum;\n"
1264" TimerInfo[j].Max = Max ;\n"
1265" TimerInfo[j].Average = Average;\n"
1266" TimerInfo[j].FrameAverage = FrameAverage;\n"
1267" TimerInfo[j].FrameCallAverage = FrameCallAverage;\n"
1268" TimerInfo[j].FrameMax = FrameMax;\n"
1269" }\n"
1270" ProfileLeave();\n"
1271"}\n"
1272"\n"
1273"var FlashFrames = 10;\n"
1274"var FlashFrameCounter = 0;\n"
1275"var FlashMessage = \'\';\n"
1276"function TimeString(Diff)\n"
1277"{\n"
1278" var DiffString = \"0 sec\";\n"
1279" var DiffTable = [1,60,60*60,60*60*24];\n"
1280" var DiffNameTable = [\"sec\", \"min\", \"hr\", \"day\"];\n"
1281" for(var i = 0; i < DiffTable.length; ++i)\n"
1282" {\n"
1283" if(Diff >= DiffTable[i])\n"
1284" {\n"
1285" DiffString = Math.floor(Diff / DiffTable[i]) + \" \" + DiffNameTable[i];\n"
1286" }\n"
1287" }\n"
1288" return DiffString;\n"
1289"\n"
1290"}\n"
1291"function ShowFlashMessage(Message, FrameCount)\n"
1292"{\n"
1293" FlashMessage = Message;\n"
1294" FlashFrameCounter = FrameCount;\n"
1295"}\n"
1296"function OnPageReady()\n"
1297"{\n"
1298" var DumpDate = DumpUtcCaptureTime;\n"
1299" var CurrentDate = Date.now() / 1000;\n"
1300" var Diff = CurrentDate - DumpDate;\n"
1301" var Limit = 10*60;//flash old message when loading captures older than 10 minutes \n"
1302" if(Diff > Limit)\n"
1303" {\n"
1304" ShowFlashMessage(\"Captured \" + TimeString(Diff) + \" ago\", 100);\n"
1305" }\n"
1306" if(!nHideHelp)\n"
1307" {\n"
1308" ShowHelp(1,0);\n"
1309" }\n"
1310"}\n"
1311"\n"
1312"function DrawFlashMessage(context)\n"
1313"{\n"
1314" if(FlashFrameCounter > 0)\n"
1315" {\n"
1316" if(FlashFrameCounter>1)\n"
1317" {\n"
1318" var FlashPrc = Math.sin(FlashFrameCounter / FlashFrames);\n"
1319" context.font = FontFlash;\n"
1320" context.globalAlpha = FlashPrc * 0.35 + 0.5;\n"
1321" context.textAlign = \'center\';\n"
1322" context.fillStyle = \'red\';\n"
1323" context.fillText(FlashMessage, nWidth * 0.5, 50);\n"
1324" context.globalAlpha = 1;\n"
1325" context.textAlign = \'left\';\n"
1326" context.font = Font;\n"
1327" }\n"
1328" FlashFrameCounter -= 1;\n"
1329"\n"
1330" }\n"
1331"}\n"
1332"\n"
1333"function DrawCaptureInfo(context)\n"
1334"{\n"
1335" context.fillStyle = \'white\';\n"
1336" context.textAlign = \'right\';\n"
1337" context.font = Font;\n"
1338" var DumpDate = DumpUtcCaptureTime;\n"
1339" var CurrentDate = Date.now() / 1000;\n"
1340" var Diff = CurrentDate - DumpDate;\n"
1341" var DiffString = TimeString(Diff) + \" ago\";\n"
1342" context.fillText(new Date(DumpDate*1000).toLocaleString(), nWidth, FontHeight);\n"
1343" if(Mode == ModeTimers)\n"
1344" {\n"
1345" context.fillText(\"Timer Frames: \" + AggregateInfo.Frames, nWidth, FontHeight*2);\n"
1346" }\n"
1347" else\n"
1348" {\n"
1349" context.fillText(\"Detailed Frames \"+ Frames.length, nWidth, FontHeight*2);\n"
1350" }\n"
1351" context.fillText(DumpHost, nWidth, FontHeight*3);\n"
1352" context.fillText(DiffString, nWidth, FontHeight*4);\n"
1353" context.textAlign = \'left\';\n"
1354" DrawFlashMessage(context);\n"
1355"}\n"
1356"\n"
1357"function DrawDetailedFrameHistory()\n"
1358"{\n"
1359" ProfileEnter(\"DrawDetailedFrameHistory\");\n"
1360" var x = HistoryViewMouseX;\n"
1361"\n"
1362" var context = CanvasHistory.getContext(\'2d\');\n"
1363" context.clearRect(0, 0, CanvasHistory.width, CanvasHistory.height);\n"
1364"\n"
1365" var fHeight = nHistoryHeight;\n"
1366" var fWidth = nWidth / Frames.length;\n"
1367" var fHeightScale = fHeight / ReferenceTime;\n"
1368" var fX = 0;\n"
1369" var FrameIndex = -1;\n"
1370" var MouseDragging = MouseDragState != MouseDragOff;\n"
1371" fRangeBeginHistory = fRangeEndHistory = -1;\n"
1372" fRangeBeginHistoryGpu = fRangeEndHistoryGpu = -1;\n"
1373"\n"
1374" var FrameFirst = -1;\n"
1375" var FrameLast = nWidth;\n"
1376" var fDetailedOffsetEnd = fDetailedOffset + fDetailedRange;\n"
1377" for(i = 0; i < Frames.length; i++)\n"
1378" {\n"
1379" var fMs = Frames[i].frameend - Frames[i].framestart;\n"
1380" if(fDetailedOffset <= Frames[i].frameend && fDetailedOffset >= Frames[i].framestart)\n"
1381" {\n"
1382" var lerp = (fDetailedOffset - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\n"
1383" FrameFirst = fX + fWidth * lerp;\n"
1384" }\n"
1385" if(fDetailedOffsetEnd <= Frames[i].frameend && fDetailedOffsetEnd >= Frames[i].framestart)\n"
1386" {\n"
1387" var lerp = (fDetailedOffsetEnd - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\n"
1388" FrameLast = fX + fWidth * lerp;\n"
1389" }\n"
1390" var fH = fHeightScale * fMs;\n"
1391" var bMouse = x > fX && x < fX + fWidth;\n"
1392" if(bMouse && !MouseDragging)\n"
1393" {\n"
1394" context.fillStyle = FRAME_HISTORY_COLOR_GPU;\n"
1395" fRangeBeginHistory = Frames[i].framestart;\n"
1396" fRangeEndHistory = Frames[i].frameend;\n"
1397" if(Frames[i].framestartgpu)\n"
1398" {\n"
1399" fRangeBeginHistoryGpu = Frames[i].framestartgpu;\n"
1400" fRangeEndHistoryGpu = Frames[i].frameendgpu;\n"
1401" }\n"
1402" FrameIndex = i;\n"
1403" }\n"
1404" else\n"
1405" {\n"
1406" context.fillStyle = FRAME_HISTORY_COLOR_CPU;\n"
1407" }\n"
1408" context.fillRect(fX, fHeight - fH, fWidth-1, fH);\n"
1409" fX += fWidth;\n"
1410" }\n"
1411"\n"
1412" var fRangeHistoryBegin = FrameFirst;\n"
1413" var fRangeHistoryEnd = FrameLast;\n"
1414" var X = fRangeHistoryBegin;\n"
1415" var Y = 0;\n"
1416" var W = fRangeHistoryEnd - fRangeHistoryBegin;\n"
1417" context.globalAlpha = 0.35;\n"
1418" context.fillStyle = \'#009900\';\n"
1419" context.fillRect(X, Y, W, fHeight);\n"
1420" context.globalAlpha = 1;\n"
1421" context.strokeStyle = \'#00ff00\';\n"
1422" context.beginPath();\n"
1423" context.moveTo(X, Y);\n"
1424" context.lineTo(X, Y+fHeight);\n"
1425" context.moveTo(X+W, Y);\n"
1426" context.lineTo(X+W, Y+fHeight);\n"
1427" context.stroke();\n"
1428"\n"
1429"\n"
1430"\n"
1431"\n"
1432" DrawCaptureInfo(context);\n"
1433"\n"
1434" if(FrameIndex>=0 && !MouseDragging)\n"
1435" {\n"
1436" var StringArray = [];\n"
1437" StringArray.push(\"Frame\");\n"
1438" StringArray.push(\"\" + FrameIndex);\n"
1439" StringArray.push(\"Time\");\n"
1440" StringArray.push(\"\" + (Frames[FrameIndex].frameend - Frames[FrameIndex].framestart).toFixed(3));\n"
1441"\n"
1442" DrawToolTip(StringArray, CanvasHistory, HistoryViewMouseX, HistoryViewMouseY+20);\n"
1443"\n"
1444" }\n"
1445" ProfileLeave();\n"
1446"}\n"
1447"function TimeToMsString(Time)\n"
1448"{\n"
1449" return Time.toFixed(3) + \"ms\";\n"
1450"}\n"
1451"function TimeToString(Time)\n"
1452"{\n"
1453" if(Time > 1000)\n"
1454" {\n"
1455" return (Time/1000.0).toFixed(0) +\"s\";\n"
1456" }\n"
1457" else if(Time > 0.9)\n"
1458" {\n"
1459" return Time.toFixed(0) + \"ms\";\n"
1460" }\n"
1461" else if(Time > 0.0009)\n"
1462" {\n"
1463" return (Time*1000).toFixed(0) + \"us\";\n"
1464" }\n"
1465" else\n"
1466" {\n"
1467" return (Time*1000000).toFixed(0) + \"ns\";\n"
1468" }\n"
1469"}\n"
1470"\n"
1471"function DrawDetailedBackground(context)\n"
1472"{\n"
1473" var fMs = fDetailedRange;\n"
1474" var fMsEnd = fMs + fDetailedOffset;\n"
1475" var fMsToScreen = nWidth / fMs;\n"
1476" var fRate = Math.floor(2*((Math.log(fMs)/Math.log(10))-1))/2;\n"
1477" var fStep = Math.pow(10, fRate);\n"
1478" var fRcpStep = 1.0 / fStep;\n"
1479" var nColorIndex = Math.floor(fDetailedOffset * fRcpStep) % 2;\n"
1480" if(nColorIndex < 0)\n"
1481" nColorIndex = -nColorIndex;\n"
1482" var fStart = Math.floor(fDetailedOffset * fRcpStep) * fStep;\n"
1483" var fHeight = CanvasDetailedView.height;\n"
1484" var fScaleX = nWidth / fDetailedRange; \n"
1485" var HeaderString = TimeToString(fStep);\n"
1486" context.textAlign = \'center\';\n"
1487" for(f = fStart; f < fMsEnd; )\n"
1488" {\n"
1489" var fNext = f + fStep;\n"
1490" var X = (f - fDetailedOffset) * fScaleX;\n"
1491" var W = (fNext-f)*fScaleX;\n"
1492" context.fillStyle = nBackColors[nColorIndex];\n"
1493" context.fillRect(X, 0, W+2, fHeight);\n"
1494" nColorIndex = 1 - nColorIndex;\n"
1495" context.fillStyle = \'#777777\'\n"
1496" context.fillText(HeaderString, X + W * 0.5, 10);\n"
1497" context.fillText(HeaderString, X + W * 0.5, nHeight - 10);\n"
1498" f = fNext;\n"
1499" }\n"
1500" context.textAlign = \'left\';\n"
1501" var fScaleX = nWidth / fDetailedRange; \n"
1502" context.globalAlpha = 0.5;\n"
1503" context.strokeStyle = \'#bbbbbb\';\n"
1504" context.beginPath();\n"
1505" for(var i = 0; i < Frames.length; i++)\n"
1506" {\n"
1507" var frfr = Frames[i];\n"
1508" if(frfr.frameend < fDetailedOffset || frfr.framestart > fDetailedOffset + fDetailedRange)\n"
1509" {\n"
1510" continue;\n"
1511" }\n"
1512" var X = (frfr.framestart - fDetailedOffset) * fScaleX;\n"
1513" if(X >= 0 && X < nWidth)\n"
1514" {\n"
1515" context.moveTo(X, 0);\n"
1516" context.lineTo(X, nHeight);\n"
1517" }\n"
1518" }\n"
1519" context.stroke();\n"
1520" context.globalAlpha = 1;\n"
1521"\n"
1522"}\n"
1523"function DrawToolTip(StringArray, Canvas, x, y)\n"
1524"{\n"
1525" var context = Canvas.getContext(\'2d\');\n"
1526" context.font = Font;\n"
1527" var WidthArray = Array(StringArray.length);\n"
1528" var nMaxWidth = 0;\n"
1529" var nHeight = 0;\n"
1530" for(i = 0; i < StringArray.length; i += 2)\n"
1531" {\n"
1532" var nWidth0 = context.measureText(StringArray[i]).width;\n"
1533" var nWidth1 = context.measureText(StringArray[i+1]).width;\n"
1534" var nSum = nWidth0 + nWidth1;\n"
1535" WidthArray[i] = nWidth0;\n"
1536" WidthArray[i+1] = nWidth1;\n"
1537" if(nSum > nMaxWidth)\n"
1538" {\n"
1539" nMaxWidth = nSum;\n"
1540" }\n"
1541" nHeight += BoxHeight;\n"
1542" }\n"
1543" nMaxWidth += 15;\n"
1544" //bounds check.\n"
1545" var CanvasRect = Canvas.getBoundingClientRect();\n"
1546" if(y + nHeight > CanvasRect.height)\n"
1547" {\n"
1548" y = CanvasRect.height - nHeight;\n"
1549" x += 20;\n"
1550" }\n"
1551" if(x + nMaxWidth > CanvasRect.width)\n"
1552" {\n"
1553" x = CanvasRect.width - nMaxWidth;\n"
1554" }\n"
1555"\n"
1556" context.fillStyle = \'black\';\n"
1557" context.fillRect(x-1, y, nMaxWidth+2, nHeight);\n"
1558" context.fillStyle = \'white\';\n"
1559"\n"
1560" var XPos = x;\n"
1561" var XPosRight = x + nMaxWidth;\n"
1562" var YPos = y + BoxHeight-2;\n"
1563" for(i = 0; i < StringArray.length; i += 2)\n"
1564" {\n"
1565" context.fillText(StringArray[i], XPos, YPos);\n"
1566" context.fillText(StringArray[i+1], XPosRight - WidthArray[i+1], YPos);\n"
1567" YPos += BoxHeight;\n"
1568" }\n"
1569"}\n"
1570"function DrawHoverToolTip()\n"
1571"{\n"
1572" ProfileEnter(\"DrawHoverToolTip\");\n"
1573" if(nHoverToken != -1)\n"
1574" {\n"
1575" var StringArray = [];\n"
1576" var groupid = TimerInfo[nHoverToken].group;\n"
1577" StringArray.push(\"Timer\");\n"
1578" StringArray.push(TimerInfo[nHoverToken].name);\n"
1579" StringArray.push(\"Group\");\n"
1580" StringArray.push(GroupInfo[groupid].name);\n"
1581"\n"
1582" var bShowTimers = Mode == ModeTimers;\n"
1583" if(FlipToolTip)\n"
1584" {\n"
1585" bShowTimers = !bShowTimers;\n"
1586" }\n"
1587" if(bShowTimers)\n"
1588" {\n"
1589"\n"
1590" StringArray.push(\"\");\n"
1591" StringArray.push(\"\");\n"
1592" var Timer = TimerInfo[nHoverToken];\n"
1593" StringArray.push(\"Average\");\n"
1594" StringArray.push(Timer.average);\n"
1595" StringArray.push(\"Max\");\n"
1596" StringArray.push(Timer.max);\n"
1597" StringArray.push(\"Excl Max\");\n"
1598" StringArray.push(Timer.exclmax);\n"
1599" StringArray.push(\"Excl Average\");\n"
1600" StringArray.push(Timer.exclaverage);\n"
1601" StringArray.push(\"Call Average\");\n"
1602" StringArray.push(Timer.callaverage);\n"
1603" StringArray.push(\"Call Count\");\n"
1604" StringArray.push(Timer.callcount);\n"
1605"\n"
1606" StringArray.push(\"\");\n"
1607" StringArray.push(\"\");\n"
1608"\n"
1609"\n"
1610" StringArray.push(\"Group\");\n"
1611" StringArray.push(GroupInfo[groupid].name);\n"
1612" StringArray.push(\"Average\");\n"
1613" StringArray.push(GroupInfo[groupid].average);\n"
1614" StringArray.push(\"Max\");\n"
1615" StringArray.push(GroupInfo[groupid].max);\n"
1616"\n"
1617" StringArray.push(\"\");\n"
1618" StringArray.push(\"\");\n"
1619"\n"
1620" StringArray.push(\"";
1621
1622const size_t g_MicroProfileHtml_end_0_size = sizeof(g_MicroProfileHtml_end_0);
1623const char g_MicroProfileHtml_end_1[] =
1624"Timer Capture\");\n"
1625" StringArray.push(\"\");\n"
1626" StringArray.push(\"Frames\");\n"
1627" StringArray.push(AggregateInfo.Frames);\n"
1628" StringArray.push(\"Time\");\n"
1629" StringArray.push(AggregateInfo.Time.toFixed(2) + \"ms\");\n"
1630"\n"
1631"\n"
1632"\n"
1633"\n"
1634" }\n"
1635" else\n"
1636" {\n"
1637" StringArray.push(\"\");\n"
1638" StringArray.push(\"\");\n"
1639"\n"
1640"\n"
1641"\n"
1642" StringArray.push(\"Time\");\n"
1643" StringArray.push((fRangeEnd-fRangeBegin).toFixed(3));\n"
1644" StringArray.push(\"\");\n"
1645" StringArray.push(\"\");\n"
1646" StringArray.push(\"Total\");\n"
1647" StringArray.push(\"\" + TimerInfo[nHoverToken].Sum);\n"
1648" StringArray.push(\"Max\");\n"
1649" StringArray.push(\"\" + TimerInfo[nHoverToken].Max);\n"
1650" StringArray.push(\"Average\");\n"
1651" StringArray.push(\"\" + TimerInfo[nHoverToken].Average);\n"
1652" StringArray.push(\"Count\");\n"
1653" StringArray.push(\"\" + TimerInfo[nHoverToken].CallCount);\n"
1654"\n"
1655" StringArray.push(\"\");\n"
1656" StringArray.push(\"\");\n"
1657"\n"
1658" StringArray.push(\"Max/Frame\");\n"
1659" StringArray.push(\"\" + TimerInfo[nHoverToken].FrameMax);\n"
1660"\n"
1661" StringArray.push(\"Average Time/Frame\");\n"
1662" StringArray.push(\"\" + TimerInfo[nHoverToken].FrameAverage);\n"
1663"\n"
1664" StringArray.push(\"Average Count/Frame\");\n"
1665" StringArray.push(\"\" + TimerInfo[nHoverToken].FrameCallAverage);\n"
1666"\n"
1667"\n"
1668"\n"
1669"\n"
1670"\n"
1671" \n"
1672" if(nHoverFrame != -1)\n"
1673" {\n"
1674" StringArray.push(\"\");\n"
1675" StringArray.push(\"\");\n"
1676" StringArray.push(\"Frame \" + nHoverFrame);\n"
1677" StringArray.push(\"\");\n"
1678"\n"
1679" var FrameTime = new Object();\n"
1680" CalculateTimers(FrameTime, nHoverToken, nHoverFrame, nHoverFrame+1);\n"
1681" StringArray.push(\"Total\");\n"
1682" StringArray.push(\"\" + FrameTime.Sum);\n"
1683" StringArray.push(\"Count\");\n"
1684" StringArray.push(\"\" + FrameTime.CallCount);\n"
1685" StringArray.push(\"Average\");\n"
1686" StringArray.push(\"\" + FrameTime.Average);\n"
1687" StringArray.push(\"Max\");\n"
1688" StringArray.push(\"\" + FrameTime.Max);\n"
1689" }\n"
1690"\n"
1691" var HoverInfo = GatherHoverMetaCounters(nHoverToken, nHoverTokenIndex, nHoverTokenLogIndex, nHoverFrame);\n"
1692" var Header = 0;\n"
1693" for(index in HoverInfo)\n"
1694" {\n"
1695" if(0 == Header)\n"
1696" {\n"
1697" Header = 1;\n"
1698" StringArray.push(\"\");\n"
1699" StringArray.push(\"\");\n"
1700" StringArray.push(\"Meta\");\n"
1701" StringArray.push(\"\");\n"
1702"\n"
1703" }\n"
1704" StringArray.push(\"\"+index);\n"
1705" StringArray.push(\"\"+HoverInfo[index]);\n"
1706" }\n"
1707"\n"
1708" StringArray.push(\"\");\n"
1709" StringArray.push(\"\");\n"
1710"\n"
1711" StringArray.push(\"Detailed Capture\");\n"
1712" StringArray.push(\"\");\n"
1713" StringArray.push(\"Frames\");\n"
1714" StringArray.push(Frames.length);\n"
1715" StringArray.push(\"Time\");\n"
1716" StringArray.push(DetailedTotal().toFixed(2) + \"ms\");\n"
1717"\n"
1718"\n"
1719" }\n"
1720" DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n"
1721" }\n"
1722" else if(nHoverCSCpu >= 0)\n"
1723" {\n"
1724" var StringArray = [];\n"
1725" StringArray.push(\"Context Switch\");\n"
1726" StringArray.push(\"\");\n"
1727" StringArray.push(\"\");\n"
1728" StringArray.push(\"\");\n"
1729" StringArray.push(\"Cpu\");\n"
1730" StringArray.push(\"\" + nHoverCSCpu);\n"
1731" StringArray.push(\"Begin\");\n"
1732" StringArray.push(\"\" + fRangeBegin);\n"
1733" StringArray.push(\"End\");\n"
1734" StringArray.push(\"\" + fRangeEnd);\n"
1735" DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n"
1736" }\n"
1737" ProfileLeave();\n"
1738"}\n"
1739"\n"
1740"function FormatMeta(Value, Dec)\n"
1741"{\n"
1742" if(!Value)\n"
1743" {\n"
1744" Value = \"0\";\n"
1745" }\n"
1746" else\n"
1747" {\n"
1748" Value = \'\' + Value.toFixed(Dec);\n"
1749" }\n"
1750" return Value;\n"
1751"}\n"
1752"\n"
1753"function DrawBarView()\n"
1754"{\n"
1755" ProfileEnter(\"DrawBarView\");\n"
1756" Invalidate++;\n"
1757" nHoverToken = -1;\n"
1758" nHoverFrame = -1;\n"
1759" var context = CanvasDetailedView.getContext(\'2d\');\n"
1760" context.clearRect(0, 0, nWidth, nHeight);\n"
1761"\n"
1762" var Height = BoxHeight;\n"
1763" var Width = nWidth;\n"
1764"\n"
1765" //clamp offset to prevent scrolling into the void\n"
1766" var nTotalRows = 0;\n"
1767" for(var groupid in GroupInfo)\n"
1768" {\n"
1769" if(GroupsAllActive || GroupsActive[GroupInfo[groupid].name])\n"
1770" {\n"
1771" nTotalRows += GroupInfo[groupid].TimerArray.length + 1;\n"
1772" }\n"
1773" }\n"
1774" var nTotalRowPixels = nTotalRows * Height;\n"
1775" var nFrameRows = nHeight - BoxHeight;\n"
1776" if(nOffsetBarsY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\n"
1777" {\n"
1778" nOffsetBarsY = nTotalRowPixels - nFrameRows;\n"
1779" }\n"
1780"\n"
1781"\n"
1782" var Y = -nOffsetBarsY + BoxHeight;\n"
1783" if(TimersGroups)\n"
1784" {\n"
1785" nOffsetBarsX = 0;\n"
1786" }\n"
1787" var XBase = -nOffsetBarsX;\n"
1788" var nColorIndex = 0;\n"
1789"\n"
1790" context.fillStyle = \'white\';\n"
1791" context.font = Font;\n"
1792" var bMouseIn = 0;\n"
1793" var RcpReferenceTime = 1.0 / ReferenceTime;\n"
1794" var CountWidth = 8 * FontWidth;\n"
1795" var nMetaLen = TimerInfo[0].meta.length;\n"
1796" var nMetaCharacters = 10;\n"
1797" for(var i = 0; i < nMetaLen; ++i)\n"
1798" {\n"
1799" if(nMetaCharacters < MetaNames[i].length)\n"
1800" nMetaCharacters = MetaNames[i].length;\n"
1801" }\n"
1802" var nWidthMeta = nMetaCharacters * FontWidth + 6;\n"
1803" function DrawHeaderSplit(Header)\n"
1804" {\n"
1805" context.fillStyle = \'white\';\n"
1806" context.fillText(Header, X, Height-FontAscent);\n"
1807" X += nWidthBars;\n"
1808" context.fillStyle = nBackColorOffset;\n"
1809" X += nWidthMs;\n"
1810" if(X >= NameWidth)\n"
1811" {\n"
1812" context.fillRect(X-3, 0, 1, nHeight);\n"
1813" }\n"
1814" }\n"
1815" function DrawHeaderSplitSingle(Header, Width)\n"
1816" {\n"
1817" context.fillStyle = \'white\';\n"
1818" context.fillText(Header, X, Height-FontAscent);\n"
1819" X += Width;\n"
1820" context.fillStyle = nBackColorOffset;\n"
1821" if(X >= NameWidth)\n"
1822" {\n"
1823" context.fillRect(X-3, 0, 1, nHeight);\n"
1824" }\n"
1825" }\n"
1826" function DrawHeaderSplitLeftRight(HeaderLeft, HeaderRight, Width)\n"
1827" {\n"
1828" context.textAlign = \'left\';\n"
1829" context.fillStyle = \'white\';\n"
1830" context.fillText(HeaderLeft, X, Height-FontAscent);\n"
1831" X += Width;\n"
1832" context.textAlign = \'right\';\n"
1833" context.fillText(HeaderRight, X-5, Height-FontAscent);\n"
1834" context.textAlign = \'left\';\n"
1835" context.fillStyle = nBackColorOffset;\n"
1836" if(X >= NameWidth)\n"
1837" {\n"
1838" context.fillRect(X-3, 0, 1, nHeight);\n"
1839" }\n"
1840" }\n"
1841" function DrawTimer(Value, Color)\n"
1842" {\n"
1843" var Prc = Value * RcpReferenceTime;\n"
1844" var YText = Y+Height-FontAscent;\n"
1845" if(Prc > 1)\n"
1846" {\n"
1847" Prc = 1;\n"
1848" }\n"
1849" context.fillStyle = Color;\n"
1850" context.fillRect(X+1, Y+1, Prc * nBarsWidth, InnerBoxHeight);\n"
1851" X += nWidthBars;\n"
1852" context.fillStyle = \'white\';\n"
1853" context.fillText((\" \" + Value.toFixed(2)).slice(-TimerLen), X, YText);\n"
1854" X += nWidthMs;\n"
1855" }\n"
1856" function DrawMeta(Value, Width, Dec)\n"
1857" {\n"
1858" Value = FormatMeta(Value, Dec);\n"
1859" X += (FontWidth*Width);\n"
1860" context.textAlign = \'right\';\n"
1861" context.fillText(Value, X-FontWidth, YText);\n"
1862" context.textAlign = \'left\';\n"
1863" }\n"
1864" var InnerBoxHeight = BoxHeight-2;\n"
1865" var TimerLen = 6;\n"
1866" var TimerWidth = TimerLen * FontWidth;\n"
1867" var nWidthBars = nBarsWidth+2;\n"
1868" var nWidthMs = TimerWidth+2+10;\n"
1869"\n"
1870"\n"
1871" if(2 == TimersGroups)\n"
1872" {\n"
1873" for(var i = 0; i < ThreadNames.length; ++i)\n"
1874" {\n"
1875" if(ThreadsActive[ThreadNames[i]] || ThreadsAllActive)\n"
1876" {\n"
1877" var X = 0;\n"
1878" var YText = Y+Height-FontAscent;\n"
1879" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"
1880" nColorIndex = 1-nColorIndex;\n"
1881" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1882" context.fillRect(0, Y, Width, Height);\n"
1883" var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n"
1884" context.fillStyle = ThreadColor;\n"
1885" context.fillText(ThreadNames[i], 1, YText);\n"
1886" context.textAlign = \'left\';\n"
1887" Y += Height;\n"
1888" for(var idx in GroupOrder)\n"
1889" {\n"
1890" var groupid = GroupOrder[idx];\n"
1891" var Group = GroupInfo[groupid];\n"
1892" var PerThreadTimer = ThreadGroupTimeArray[i][groupid];\n"
1893" var PerThreadTimerTotal = ThreadGroupTimeTotalArray[i][groupid];\n"
1894" if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (GroupsAllActive || GroupsActive[Group.name]))\n"
1895" {\n"
1896" var GColor = GroupColors ? GroupInfo[groupid].color : \'white\';\n"
1897" var X = 0;\n"
1898" nColorIndex = 1-nColorIndex;\n"
1899" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"
1900" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1901" context.fillRect(0, Y, Width, nHeight);\n"
1902" context.fillStyle = GColor;\n"
1903" context.textAlign = \'right\';\n"
1904" context.fillText(Group.name, NameWidth - 5, Y+Height-FontAscent);\n"
1905" context.textAlign = \'left\';\n"
1906" X += NameWidth;\n"
1907" DrawTimer(PerThreadTimer, GColor);\n"
1908" X += nWidthBars + nWidthMs; \n"
1909" DrawTimer(PerThreadTimerTotal, GColor);\n"
1910"\n"
1911" Y += Height;\n"
1912" }\n"
1913" }\n"
1914" }\n"
1915" }\n"
1916" }\n"
1917" else\n"
1918" {\n"
1919" for(var idx in GroupOrder)\n"
1920" {\n"
1921" var groupid = GroupOrder[idx];\n"
1922" var Group = GroupInfo[groupid];\n"
1923" var GColor = GroupColors ? GroupInfo[groupid].color : \'white\';\n"
1924" if(GroupsAllActive || GroupsActive[Group.name])\n"
1925" {\n"
1926" var TimerArray = Group.TimerArray;\n"
1927" var X = XBase;\n"
1928" nColorIndex = 1-nColorIndex;\n"
1929" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"
1930" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1931" context.fillRect(0, Y, Width, nHeight);\n"
1932" context.fillStyle = GColor;\n"
1933" context.fillText(Group.name, 1, Y+Height-FontAscent);\n"
1934" X += NameWidth;\n"
1935" DrawTimer(Group.average, GColor);\n"
1936" DrawTimer(Group.max, GColor);\n"
1937" DrawTimer(Group.total, GColor);\n"
1938"\n"
1939" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1940" context.fillRect(0, Y, NameWidth, nHeight);\n"
1941" context.fillStyle = GColor;\n"
1942" context.fillText(Group.name, 1, Y+Height-FontAscent);\n"
1943"\n"
1944"\n"
1945"\n"
1946" Y += Height;\n"
1947" if(TimersGroups)\n"
1948" {\n"
1949" for(var i = 0; i < ThreadNames.length; ++i)\n"
1950" {\n"
1951" var PerThreadTimer = ThreadGroupTimeArray[i][groupid];\n"
1952" var PerThreadTimerTotal = ThreadGroupTimeTotalArray[i][groupid];\n"
1953" if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (ThreadsActive[ThreadNames[i]] || ThreadsAllActive))\n"
1954" {\n"
1955" var YText = Y+Height-FontAscent;\n"
1956" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"
1957" nColorIndex = 1-nColorIndex;\n"
1958" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1959" context.fillRect(0, Y, Width, Height);\n"
1960" var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n"
1961" context.fillStyle = ThreadColor;\n"
1962" context.textAlign = \'right\';\n"
1963" context.fillText(ThreadNames[i], NameWidth - 5, YText);\n"
1964" context.textAlign = \'left\';\n"
1965" X = NameWidth;\n"
1966" DrawTimer(PerThreadTimer, ThreadColor);\n"
1967" X += nWidthBars + nWidthMs; \n"
1968" DrawTimer(PerThreadTimerTotal, ThreadColor);\n"
1969" Y += Height;\n"
1970" }\n"
1971" }\n"
1972" }\n"
1973" else\n"
1974" {\n"
1975" for(var timerindex in TimerArray)\n"
1976" {\n"
1977" var timerid = TimerArray[timerindex];\n"
1978" var Timer = TimerInfo[timerid];\n"
1979" var Average = Timer.average;\n"
1980" var Max = Timer.max;\n"
1981" var ExclusiveMax = Timer.exclmax;\n"
1982" var ExclusiveAverage = Timer.exclaverage;\n"
1983" var CallAverage = Timer.callaverage;\n"
1984" var CallCount = Timer.callcount;\n"
1985" var YText = Y+Height-FontAscent;\n"
1986" X = NameWidth + XBase;\n"
1987"\n"
1988" nColorIndex = 1-nColorIndex;\n"
1989" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"
1990" if(bMouseIn)\n"
1991" {\n"
1992" nHoverToken = timerid;\n"
1993" }\n"
1994" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
1995" context.fillRect(0, Y, Width, Height);\n"
1996"\n"
1997" DrawTimer(Average, Timer.color);\n"
1998" DrawTimer(Max,Timer.color);\n"
1999" DrawTimer(Timer.total,Timer.color);\n"
2000" DrawTimer(CallAverage,Timer.color);\n"
2001" context.fillStyle = \'white\';\n"
2002" context.fillText(CallCount, X, YText);\n"
2003" X += CountWidth;\n"
2004" DrawTimer(ExclusiveAverage,Timer.color);\n"
2005" DrawTimer(ExclusiveMax,Timer.color);\n"
2006"\n"
2007" if(TimersMeta)\n"
2008" {\n"
2009" context.fillStyle = \'white\';\n"
2010" for(var j = 0; j < nMetaLen; ++j)\n"
2011" {\n"
2012" // var Len = MetaNames[j].length + 1;\n"
2013" DrawMeta(Timer.meta[j], MetaLengths[j], 0);\n"
2014" DrawMeta(Timer.metaavg[j], MetaLengthsAvg[j], 2);\n"
2015" DrawMeta(Timer.metamax[j], MetaLengthsMax[j], 0);\n"
2016" }\n"
2017" }\n"
2018" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"
2019" context.fillRect(0, Y, NameWidth, Height);\n"
2020" context.textAlign = \'right\';\n"
2021" context.fillStyle = Timer.color;\n"
2022" context.fillText(Timer.name, NameWidth - 5, YText);\n"
2023" context.textAlign = \'left\';\n"
2024"\n"
2025"\n"
2026" Y += Height;\n"
2027" } \n"
2028" }\n"
2029" }\n"
2030" }\n"
2031" }\n"
2032" X = 0;\n"
2033" context.fillStyle = nBackColorOffset;\n"
2034" context.fillRect(0, 0, Width, Height);\n"
2035" context.fillStyle = \'white\';\n"
2036" if(TimersGroups)\n"
2037" {\n"
2038" if(2 == TimersGroups)\n"
2039" {\n"
2040" DrawHeaderSplitLeftRight(\'Thread\', \'Group\', NameWidth);\n"
2041" DrawHeaderSplit(\'Average\');\n"
2042" }\n"
2043" else\n"
2044" {\n"
2045" DrawHeaderSplitLeftRight(\'Group\', \'Thread\', NameWidth);\n"
2046" DrawHeaderSplit(\'Average\');\n"
2047" DrawHeaderSplit(\'Max\');\n"
2048" DrawHeaderSplit(\'Total\');\n"
2049" }\n"
2050" }\n"
2051" else\n"
2052" {\n"
2053" X = NameWidth + XBase;\n"
2054" DrawHeaderSplit(\'Average\');\n"
2055" DrawHeaderSplit(\'Max\');\n"
2056" DrawHeaderSplit(\'Total\');\n"
2057" DrawHeaderSplit(\'Call Average\');\n"
2058" DrawHeaderSplitSingle(\'Count\', CountWidth);\n"
2059" DrawHeaderSplit(\'Excl Average\');\n"
2060" DrawHeaderSplit(\'Excl Max\');\n"
2061" if(TimersMeta)\n"
2062" {\n"
2063" for(var i = 0; i < nMetaLen; ++i)\n"
2064" {\n"
2065" DrawHeaderSplitSingle(MetaNames[i], MetaLengths[i] * FontWidth);\n"
2066" DrawHeaderSplitSingle(MetaNames[i] + \" Avg\", MetaLengthsAvg[i] * FontWidth);\n"
2067" DrawHeaderSplitSingle(MetaNames[i] + \" Max\", MetaLengthsMax[i] * FontWidth);\n"
2068" }\n"
2069" }\n"
2070" X = 0;\n"
2071" context.fillStyle = nBackColorOffset;\n"
2072" context.fillRect(0, 0, NameWidth, Height);\n"
2073" context.fillStyle = \'white\';\n"
2074" \n"
2075" DrawHeaderSplitLeftRight(\'Group\', \'Timer\', NameWidth);\n"
2076" \n"
2077" }\n"
2078"\n"
2079" ProfileLeave();\n"
2080"}\n"
2081"\n"
2082"\n"
2083"//preprocess context switch data to contain array per thread\n"
2084"function PreprocessContextSwitchCacheItem(ThreadId)\n"
2085"{\n"
2086" console.log(\'context switch preparing \' + ThreadId);\n"
2087" var CSObject = CSwitchCache[ThreadId];\n"
2088" if(ThreadId > 0 && !CSObject)\n"
2089" {\n"
2090" CSArrayIn = new Array();\n"
2091" CSArrayOut = new Array();\n"
2092" CSArrayCpu = new Array();\n"
2093" var nCount = CSwitchTime.length;\n"
2094" var j = 0;\n"
2095" var TimeIn = -1.0;\n"
2096" for(var i = 0; i < nCount; ++i)\n"
2097" { \n"
2098" var ThreadIn = CSwitchThreadInOutCpu[j];\n"
2099" var ThreadOut = CSwitchThreadInOutCpu[j+1];\n"
2100" var Cpu = CSwitchThreadInOutCpu[j+2];\n"
2101" if(TimeIn < 0)\n"
2102" {\n"
2103" if(ThreadIn == ThreadId)\n"
2104" {\n"
2105" TimeIn = CSwitchTime[i];\n"
2106" }\n"
2107" }\n"
2108" else\n"
2109" {\n"
2110" if(ThreadOut == ThreadId)\n"
2111" {\n"
2112" var TimeOut = CSwitchTime[i];\n"
2113" CSArrayIn.push(TimeIn);\n"
2114" CSArrayOut.push(TimeOut);\n"
2115" CSArrayCpu.push(Cpu);\n"
2116" TimeIn = -1;\n"
2117" }\n"
2118" }\n"
2119" j += 3;\n"
2120" }\n"
2121" CSObject = new Object();\n"
2122" CSObject.Size = CSArrayIn.length;\n"
2123" CSObject.In = CSArrayIn;\n"
2124" CSObject.Out = CSArrayOut;\n"
2125" CSObject.Cpu = CSArrayCpu;\n"
2126" CSwitchCache[ThreadId] = CSObject;\n"
2127" }\n"
2128"\n"
2129"}\n"
2130"function PreprocessContextSwitchCache()\n"
2131"{\n"
2132" ProfileEnter(\"PreprocessContextSwitchCache\");\n"
2133" var AllThreads = {};\n"
2134" var nCount = CSwitchTime.length;\n"
2135" for(var i = 0; i < nCount; ++i)\n"
2136" { \n"
2137" var nThreadIn = CSwitchThreadInOutCpu[i];\n"
2138" if(!AllThreads[nThreadIn])\n"
2139" {\n"
2140" AllThreads[nThreadIn] = \'\' + nThreadIn;\n"
2141" var FoundThread = false;\n"
2142" for(var i = 0; i < ThreadIds.length; ++i)\n"
2143" {\n"
2144" if(ThreadIds[i] == nThreadIn)\n"
2145" {\n"
2146" FoundThread = true;\n"
2147" }\n"
2148" }\n"
2149" if(!FoundThread)\n"
2150" {\n"
2151" CSwitchOnlyThreads.push(nThreadIn);\n"
2152" }\n"
2153" }\n"
2154" }\n"
2155" for(var i = 0; i < CSwitchOnlyThreads.length; ++i)\n"
2156" {\n"
2157" PreprocessContextSwitchCacheItem(CSwitchOnlyThreads[i]);\n"
2158" }\n"
2159" for(var i = 0; i < ThreadIds.length; ++i)\n"
2160" {\n"
2161" PreprocessContextSwitchCacheItem(ThreadIds[i]); \n"
2162" }\n"
2163" ProfileLeave();\n"
2164"}\n"
2165"\n"
2166"function DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled)\n"
2167"{\n"
2168" ProfileEnter(\"DrawContextSwitchBars\");\n"
2169" var CSObject = CSwitchCache[ThreadId];\n"
2170" if(CSObject)\n"
2171" {\n"
2172" var Size = CSObject.Size; \n"
2173" var In = CSObject.In;\n"
2174" var Out = CSObject.Out;\n"
2175" var Cpu = CSObject.Cpu;\n"
2176" var nNumColors = CSwitchColors.length;\n"
2177" for(var i = 0; i < Size; ++i)\n"
2178" {\n"
2179" var TimeIn = In[i];\n"
2180" var TimeOut = Out[i];\n"
2181" var ActiveCpu = Cpu[i];\n"
2182"\n"
2183" var X = (TimeIn - fDetailedOffset) * fScaleX;\n"
2184" if(X > nWidth)\n"
2185" {\n"
2186" break;\n"
2187" }\n"
2188" var W = (TimeOut - TimeIn) * fScaleX;\n"
2189" if(W > MinWidth && X+W > 0)\n"
2190" {\n"
2191" if(nHoverCSCpu == ActiveCpu || bDrawEnabled)\n"
2192" {\n"
2193" if(nHoverCSCpu == ActiveCpu)\n"
2194" {\n"
2195" context.fillStyle = nHoverColor;\n"
2196" }\n"
2197" else\n"
2198" {\n"
2199" context.fillStyle = CSwitchColors[ActiveCpu % nNumColors];\n"
2200" }\n"
2201" context.fillRect(X, fOffsetY, W, CSwitchHeight);\n"
2202" }\n"
2203" if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < fOffsetY+CSwitchHeight && DetailedViewMouseY >= fOffsetY)\n"
2204" {\n"
2205" nHoverCSCpuNext = ActiveCpu;\n"
2206" fRangeBeginNext = TimeIn;\n"
2207" fRangeEndNext = TimeOut;\n"
2208" fRangeBeginGpuNext = fRangeEndGpuNext = -1;\n"
2209" }\n"
2210" }\n"
2211" }\n"
2212" }\n"
2213" ProfileLeave();\n"
2214"}\n"
2215"\n"
2216"function DrawDetailedView(context, MinWidth, bDrawEnabled)\n"
2217"{\n"
2218" if(bDrawEnabled)\n"
2219" {\n"
2220" DrawDetailedBackground(context);\n"
2221" }\n"
2222"\n"
2223" var colors = [ \'#ff0000\', \'#ff00ff\', \'#ffff00\'];\n"
2224"\n"
2225" var fScaleX = nWidth / fDetailedRange; \n"
2226" var fOffsetY = -nOffsetY + BoxHeight;\n"
2227" nHoverTokenNext = -1;\n"
2228" nHoverTokenLogIndexNext = -1;\n"
2229" nHoverTokenIndexNext = -1;\n"
2230" nHoverCounter += nHoverCounterDelta;\n"
2231" if(nHoverCounter >= 255) \n"
2232" {\n"
2233" nHoverCounter = 255;\n"
2234" nHoverCounterDelta = -nHoverCounterDelta;\n"
2235" }\n"
2236" if(nHoverCounter < 128) \n"
2237" {\n"
2238" nHoverCounter = 128;\n"
2239" nHoverCounterDelta = -nHoverCounterDelta;\n"
2240" }\n"
2241" var nHoverHigh = nHoverCounter.toString(16);\n"
2242" var nHoverLow = (127+255-nHoverCounter).toString(16);\n"
2243" var nHoverColor = \'#\' + nHoverHigh + nHoverHigh + nHoverHigh;\n"
2244"\n"
2245" context.fillStyle = \'black\';\n"
2246" context.font = Font;\n"
2247" var nNumLogs = Frames[0].ts.length;\n"
2248" var fTimeEnd = fDetailedOffset + fDetailedRange;\n"
2249"\n"
2250" var FirstFrame = 0;\n"
2251" for(var i = 0; i < Frames.length ; i++)\n"
2252" {\n"
2253" if(Frames[i].frameend < fDetailedOffset)\n"
2254" {\n"
2255" FirstFrame = i;\n"
2256" }\n"
2257" }\n"
2258" var nMinTimeMs = MinWidth / fScaleX;\n"
2259" {\n"
2260"\n"
2261" var Batches = new Array(TimerInfo.length);\n"
2262" var BatchesTxt = Array();\n"
2263" var BatchesTxtPos = Array();\n"
2264" var BatchesTxtColor = [\'#ffffff\', \'#333333\'];\n"
2265"\n"
2266" for(var i = 0; i < 2; ++i)\n"
2267" {\n"
2268" BatchesTxt[i] = Array();\n"
2269" BatchesTxtPos[i] = Array();\n"
2270" }\n"
2271" for(var i = 0; i < Batches.length; ++i)\n"
2272" {\n"
2273" Batches[i] = Array();\n"
2274" }\n"
2275" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
2276" {\n"
2277" var ThreadName = ThreadNames[nLog];\n"
2278" if(ThreadsAllActive || ThreadsActive[ThreadName])\n"
2279" {\n"
2280"\n"
2281" var LodIndex = 0;\n"
2282" var MinDelta = 0;\n"
2283" var NextLod = 1;\n"
2284" while(NextLod < LodData.length && LodData[NextLod].MinDelta[nLog] < nMinTimeMs)\n"
2285" {\n"
2286" LodIndex = NextLod;\n"
2287" NextLod = NextLod + 1;\n"
2288" MinDelta = LodData[LodIndex].MinDelta[nLog];\n"
2289" }\n"
2290" if(LodIndex == LodData.length)\n"
2291" {\n"
2292" LodIndex = LodData.length-1;\n"
2293" }\n"
2294" if(DisableLod)\n"
2295" {\n"
2296" LodIndex = 0;\n"
2297" }\n"
2298"\n"
2299" context.fillStyle = \'white\';\n"
2300" fOffsetY += BoxHeight;\n"
2301" context.fillText(ThreadName, 0, fOffsetY);\n"
2302" if(nContextSwitchEnabled)\n"
2303" {\n"
2304" DrawContextSwitchBars(context, ThreadIds[nLog], fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\n"
2305" fOffsetY += CSwitchHeight+1;\n"
2306" }\n"
2307" var MaxDepth = 1;\n"
2308" var StackPos = 0;\n"
2309" var Stack = Array(20);\n"
2310" var Lod = LodData[LodIndex];\n"
2311"\n"
2312" var TypeArray = Lod.TypeArray[nLog];\n"
2313" var IndexArray = Lod.IndexArray[nLog];\n"
2314" var TimeArray = Lod.TimeArray[nLog];\n"
2315"\n"
2316" var LocalFirstFrame = Frames[FirstFrame].FirstFrameIndex[nLog];\n"
2317" var IndexStart = Lod.LogStart[LocalFirstFrame][nLog];\n"
2318" var IndexEnd = TimeArray.length;\n"
2319" IndexEnd = TimeArray.length;\n"
2320" var HasSetHover = 0;\n"
2321"\n"
2322"\n"
2323" for(var j = IndexStart; j < IndexEnd; ++j)\n"
2324" {\n"
2325" var type = TypeArray[j];\n"
2326" var index = IndexArray[j];\n"
2327" var time = TimeArray[j];\n"
2328" if(type == 1)\n"
2329" {\n"
2330" //push\n"
2331" Stack[StackPos] = j;\n"
2332" StackPos++;\n"
2333" if(StackPos > MaxDepth)\n"
2334" {\n"
2335" MaxDepth = StackPos;\n"
2336" }\n"
2337" }\n"
2338" else if(type == 0)\n"
2339" {\n"
2340" if(StackPos>0)\n"
2341" {\n"
2342" StackPos--;\n"
2343"\n"
2344" var StartIndex = Stack[StackPos];\n"
2345" var timestart = TimeArray[StartIndex];\n"
2346" var timeend = time;\n"
2347" var X = (timestart - fDetailedOffset) * fScaleX;\n"
2348" var Y = fOffsetY + StackPos * BoxHeight;\n"
2349" var W = (timeend-timestart)*fScaleX;\n"
2350"\n"
2351" if(W > MinWidth && X < nWidth && X+W > 0)\n"
2352" {\n"
2353" if(bDrawEnabled || index == nHoverToken)\n"
2354" {\n"
2355" Batches[index].push(X);\n"
2356" Batches[index].push(Y);\n"
2357" Batches[index].push(W);\n"
2358" DebugDrawQuadCount++;\n"
2359"\n"
2360" var XText = X < 0 ? 0 : X;\n"
2361" var WText = W - (XText-X);\n"
2362" if(XText + WText > nWidth)\n"
2363" {\n"
2364" WText = nWidth - XText;\n"
2365" }\n"
2366" var Name = TimerInfo[index].name;\n"
2367" var NameLen = TimerInfo[index].len;\n"
2368" var BarTextLen = Math.floor((WText-2)/FontWidth);\n"
2369" var TimeText = TimeToMsString(timeend-timestart);\n"
2370" var TimeTextLen = TimeText.length;\n"
2371"\n"
2372" if(BarTextLen >= 2)\n"
2373" {\n"
2374" if(BarTextLen < NameLen)\n"
2375" Name = Name.substr(0, BarTextLen);\n"
2376" var txtidx = TimerInfo[index].textcolorindex;\n"
2377" var YPos = Y+BoxHeight-FontAscent;\n"
2378" BatchesTxt[txtidx].push(Name);\n"
2379" BatchesTxtPos[txtidx].push(XText+2);\n"
2380"\n"
2381" BatchesTxtPos[txtidx].push(YPos);\n"
2382" DebugDrawTextCount++;\n"
2383" if(BarTextLen - NameLen > TimeTextLen)\n"
2384" {\n"
2385" BatchesTxt[txtidx].push(TimeText);\n"
2386" BatchesTxtPos[txtidx].push(XText+WText-2 - TimeTextLen * FontWidth);\n"
2387" BatchesTxtPos[txtidx].push(YPos);\n"
2388" DebugDrawTextCount++;\n"
2389" }\n"
2390"\n"
2391" }\n"
2392" }\n"
2393"\n"
2394" if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y)\n"
2395" {\n"
2396" fRangeBeginNext = timestart;\n"
2397" fRangeEndNext = timeend;\n"
2398" if(TypeArray[StartIndex+1] == 3 && TypeArray[j+1] == 3)\n"
2399" {\n"
2400" fRangeBeginGpuNext = fRangeBeginNext;\n"
2401" fRangeEndGpuNext = fRangeEndNext;\n"
2402" //cpu tick is stored following\n"
2403" fRangeBeginNext = TimeArray[StartIndex+1];\n"
2404" fRangeEndNext = TimeArray[j+1];\n"
2405" }\n"
2406" else\n"
2407" {\n"
2408" fRangeBeginGpuNext = -1;\n"
2409" fRangeEndGpuNext = -1;\n"
2410" }\n"
2411"\n"
2412" nHoverTokenNext = index;\n"
2413" nHoverTokenIndexNext = j;\n"
2414" nHoverTokenLogIndexNext = nLog;\n"
2415" bHasSetHover = 1;\n"
2416" }\n"
2417" }\n"
2418" if(StackPos == 0 && time > fTimeEnd)\n"
2419" break; \n"
2420" }\n"
2421" }\n"
2422" }\n"
2423" fOffsetY += (1+g_MaxStack[nLog]) * BoxHeight;\n"
2424"\n"
2425" if(HasSetHover)\n"
2426" {\n"
2427" for(var i = 0; i < Frames.length-1; ++i)\n"
2428" {\n"
2429" var IndexStart = Lod.LogStart[i][nLog];\n"
2430" if(nHoverTokenNext >= IndexStart)\n"
2431" {\n"
2432" nHoverFrame = i;\n"
2433" }\n"
2434" }\n"
2435" }\n"
2436" }\n"
2437" }\n"
2438"\n"
2439" if(nContextSwitchEnabled) //non instrumented threads.\n"
2440" {\n"
2441" var ContextSwitchThreads = CSwitchOnlyThreads;\n"
2442" for(var i = 0; i < ContextSwitchThreads.length; ++i)\n"
2443" {\n"
2444" var ThreadId = ContextSwitchThreads[i];\n"
2445" var ThreadName = \'\' + ThreadId;\n"
2446" DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\n"
2447" context.fillStyle = \'white\';\n"
2448" context.fillText(ThreadName, 0, fOffsetY+5);\n"
2449" fOffsetY += BoxHeight + 1;\n"
2450" }\n"
2451" }\n"
2452"\n"
2453"\n"
2454" {\n"
2455" for(var i = 0; i < Batches.length; ++i)\n"
2456" {\n"
2457" var a = Batches[i];\n"
2458" if(a.length)\n"
2459" {\n"
2460" context.fillStyle = TimerInfo[i].colordark;\n"
2461" if(!DisableMerge)\n"
2462" {\n"
2463" for(var j = 0; j < a.length; j += 3)\n"
2464" { \n"
2465" var X = a[j];\n"
2466" var Y = a[j+1];\n"
2467" var BaseWidth = j + 2;\n"
2468" var W = a[BaseWidth];\n"
2469" while(j+1 < a.length && W < 1)\n"
2470" {\n"
2471" var jnext = j+3;\n"
2472" var XNext = a[jnext];\n"
2473" var YNext = a[jnext+1];\n"
2474" var WNext = a[jnext+2];\n"
2475" var Delta = XNext - (X+W);\n"
2476" var YDelta = Math.abs(Y - YNext); \n"
2477" if(Delta < 0.3 && YDelta < 0.5 && WNext < 1)\n"
2478" {\n"
2479" W = (XNext+WNext) - X;\n"
2480" a[BaseWidth] = W;\n"
2481" a[jnext+2] = 0;\n"
2482" j += 3;\n"
2483" }\n"
2484" else\n"
2485" {\n"
2486" break;\n"
2487" }\n"
2488"\n"
2489" }\n"
2490" }\n"
2491" }\n"
2492" var off = 0.7;\n"
2493" var off2 = 2*off;\n"
2494" context.fillStyle = TimerInfo[i].colordark;\n"
2495" for(var j = 0; j < a.length; j += 3)\n"
2496" { \n"
2497" var X = a[j];\n"
2498" var Y = a[j+1];\n"
2499" var W = a[j+2];\n"
2500" if(W >= 1)\n"
2501" {\n"
2502" context.fillRect(X, Y, W, BoxHeight-1);\n"
2503" }\n"
2504" }\n"
2505" \n"
2506"\n"
2507" if(i == nHoverToken)\n"
2508" {\n"
2509" context.fillStyle = nHoverColor;\n"
2510" }\n"
2511" else\n"
2512" {\n"
2513" context.fillStyle = TimerInfo[i].color;\n"
2514" }\n"
2515" for(var j = 0; j < a.length; j += 3)\n"
2516" { \n"
2517" var X = a[j];\n"
2518" var Y = a[j+1];\n"
2519" var W = a[j+2];\n"
2520" if(W > 0)\n"
2521" {\n"
2522" context.fillRect(X+off, Y+off, W-off2, BoxHeight-1-off2);\n"
2523" }\n"
2524" }\n"
2525" }\n"
2526" } \n"
2527" }\n"
2528" for(var i = 0; i < BatchesTxt.length; ++i)\n"
2529" {\n"
2530" context.fillStyle = BatchesTxtColor[i];\n"
2531" var TxtArray = BatchesTxt[i];\n"
2532" var PosArray = BatchesTxtPos[i];\n"
2533" for(var j = 0; j < TxtArray.length; ++j)\n"
2534" {\n"
2535" var k = j * 2;\n"
2536" context.fillText(TxtArray[j], PosArray[k],PosArray[k+1]);\n"
2537" }\n"
2538" }\n"
2539"\n"
2540" }\n"
2541"}\n"
2542"function DrawTextBox(context, text, x, y, align)\n"
2543"{\n"
2544" var textsize = context.measureText(text).width;\n"
2545" var offsetx = 0;\n"
2546" var offsety = -FontHeight;\n"
2547" if(align == \'center\')\n"
2548" {\n"
2549" offsetx = -textsize / 2.0;\n"
2550" }\n"
2551" else if(align == \'right\')\n"
2552" {\n"
2553" offsetx = -textsize;\n"
2554" }\n"
2555" context.fillStyle = nBackColors[0];\n"
2556" context.fillRect(x + offsetx, y + offsety, textsize+2, FontHeight + 2);\n"
2557" context.fillStyle = \'white\';\n"
2558" context.fillText(text, x, y);\n"
2559"\n"
2560"}\n"
2561"function DrawRange(context, fBegin, fEnd, ColorBack, ColorFront, Offset, Name)\n"
2562"{\n"
2563" if(fBegin < fEnd)\n"
2564" {\n"
2565" var fScaleX = nWidth / fDetailedRange; \n"
2566" var X = (fBegin - fDetailedOffset) * fScaleX;\n"
2567" var YSpace = (FontHeight+2);\n"
2568" var Y = YSpace * (Offset);\n"
2569" var W = (fEnd - fBegin) * fScaleX;\n"
2570" context.globalAlpha = 0.1;\n"
2571" context.fillStyle = ColorBack;\n"
2572" context.fillRect(X, 0, W, nHeight);\n"
2573" context.globalAlpha = 1;\n"
2574" context.strokeStyle = ColorFront;\n"
2575" context.beginPath();\n"
2576" context.moveTo(X, 0);\n"
2577" context.lineTo(X, nHeight);\n"
2578" context.moveTo(X+W, 0);\n"
2579" context.lineTo(X+W, nHeight);\n"
2580" context.stroke();\n"
2581" var Duration = (fEnd - fBegin).toFixed(2) + \"ms\";\n"
2582" var Center = ((fBegin + fEnd) / 2.0) - fDetailedOffset;\n"
2583" var DurationWidth = context.measureText(Duration+ \" \").width;\n"
2584"\n"
2585" context.fillStyle = \'white\';\n"
2586" context.textAlign = \'right\';\n"
2587" var TextPosY = Y + YSpace;\n"
2588" DrawTextBox(context, \'\' + fBegin.toFixed(2), X-3, TextPosY, \'right\');\n"
2589" if(DurationWidth < W + 10)\n"
2590" {\n"
2591" context.textAlign = \'center\';\n"
2592" DrawTextBox(context,\'\' + Duration,Center * fScaleX, TextPosY, \'center\');\n"
2593"\n"
2594" var W0 = W - DurationWidth + FontWidth*1.5;\n"
2595" if(W0 > 6)\n"
2596" {\n"
2597" var Y0 = Y + FontHeight * 0.5;\n"
2598" W0 = W0 / 2.0;\n"
2599" var X0 = X + W0;\n"
2600" var X1 = X + W - W0;\n"
2601" context.strokeStyle = ColorFront;\n"
2602" context.beginPath();\n"
2603" context.moveTo(X, Y0);\n"
2604" context.lineTo(X0, Y0);\n"
2605" context.moveTo(X0, Y0-2);\n"
2606" context.lineTo(X0, Y0+2);\n"
2607" context.moveTo(X1, Y0-2);\n"
2608" context.lineTo(X1, Y0+2);\n"
2609" context.moveTo(X1, Y0);\n"
2610" context.lineTo(X + W, Y0);\n"
2611" context.stroke();\n"
2612" }\n"
2613" }\n"
2614" context.textAlign = \'left\';\n"
2615" DrawTextBox(context, \'\' + fEnd.toFixed(2), X + W + 2, TextPosY, \'left\');\n"
2616" DrawTextBox(context, Name, X + W + 2, nHeight - FontHeight - YSpace*Offset, \'left\');\n"
2617" Offset += 1;\n"
2618" }\n"
2619" return Offset;\n"
2620"}\n"
2621"\n"
2622"function DrawDetailed(Animation)\n"
2623"{\n"
2624" if(AnimationActive != Animation || !Initialized)\n"
2625" {\n"
2626" return;\n"
2627" }\n"
2628" ProfileEnter(\"DrawDetailed\");\n"
2629" DebugDrawQuadCount = 0;\n"
2630" DebugDrawTextCount = 0;\n"
2631" nHoverCSCpuNext = -1;\n"
2632"\n"
2633" fRangeBeginNext = fRangeEndNext = -1;\n"
2634" fRangeBeginGpuNext = fRangeEndGpuNext = -1;\n"
2635" var fRangeBeginGpu = -1;\n"
2636" var fRangeEndGpu = -1;\n"
2637"\n"
2638" var start = new Date();\n"
2639" nDrawCount++;\n"
2640"\n"
2641" var context = CanvasDetailedView.getContext(\'2d\');\n"
2642" var offscreen = CanvasDetailedOffscreen.getContext(\'2d\');\n"
2643" var fScaleX = nWidth / fDetailedRange; \n"
2644" var fOffsetY = -nOffsetY + BoxHeight;\n"
2645"\n"
2646" if(DetailedRedrawState.fOffsetY == fOffsetY && DetailedRedrawState.fDetailedOffset == fDetailedOffset && DetailedRedrawState.fDetailedRange == fDetailedRange && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)\n"
2647" {\n"
2648" Invalidate++;\n"
2649" }\n"
2650" else\n"
2651" {\n"
2652" Invalidate = 0;\n"
2653" DetailedRedrawState.fOffsetY = fOffsetY;\n"
2654" DetailedRedrawState.fDetailedOffset = fDetailedOffset;\n"
2655" DetailedRedrawState.fDetailedRange = fDetailedRange;\n"
2656" }\n"
2657" if(Invalidate == 0) //when panning, only draw bars that are a certain width to keep decent framerate\n"
2658" {\n"
2659" context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"
2660" DrawDetailedView(context, nMinWidthPan, true);\n"
2661" }\n"
2662" else if(Invalidate == 1) //draw full and store\n"
2663" {\n"
2664" offscreen.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"
2665" DrawDetailedView(offscreen, nMinWidth, true);\n"
2666" OffscreenData = offscreen.getImageData(0, 0, CanvasDetailedOffscreen.width, CanvasDetailedOffscreen.height);\n"
2667" }\n"
2668" else//reuse stored result untill next time viewport is changed.\n"
2669" {\n"
2670" context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"
2671" context.putImageData(OffscreenData, 0, 0);\n"
2672" DrawDetailedView(context, nMinWidth, false);\n"
2673" }\n"
2674"\n"
2675" if(KeyShiftDown || KeyCtrlDown || MouseDragButton || MouseDragSelectRange())\n"
2676" {\n"
2677" nHoverToken = -1;\n"
2678" nHoverTokenIndex = -1;\n"
2679" nHoverTokenLogIndex = -1;\n"
2680" fRangeBegin = fRangeEnd = -1;\n"
2681" }\n"
2682" else\n"
2683" {\n"
2684" nHoverToken = nHoverTokenNext;\n"
2685" nHoverTokenIndex = nHoverTokenIndexNext;\n"
2686" nHoverTokenLogIndex = nHoverTokenLogIndexNext;\n"
2687" if(fRangeBeginHistory < fRangeEndHistory)\n"
2688" {\n"
2689" fRangeBegin = fRangeBeginHistory;\n"
2690" fRangeEnd = fRangeEndHistory;\n"
2691" fRangeBeginGpu = fRangeBeginHistoryGpu;\n"
2692" fRangeEndGpu = fRangeEndHistoryGpu;\n"
2693" }\n"
2694" else\n"
2695" {\n"
2696" fRangeBegin = fRangeBeginNext;\n"
2697" fRangeEnd = fRangeEndNext;\n"
2698" fRangeBeginGpu = fRangeBeginGpuNext;\n"
2699" fRangeEndGpu = fRangeEndGpuNext;\n"
2700" }\n"
2701" }\n"
2702"\n"
2703" DrawTextBox(context, TimeToMsString(fDetailedOffset), 0, FontHeight, \'left\');\n"
2704" context.textAlign = \'right\';\n"
2705" DrawTextBox(context, TimeToMsString(fDetailedOffset + fDetailedRange), nWidth, FontHeight, \'right\');\n"
2706" context.textAlign = \'left\';\n"
2707"\n"
2708" var Offset = 0;\n"
2709" Offset = DrawRange(context, fRangeBeginSelect, fRangeEndSelect, \'#59d0ff\', \'#00ddff\', Offset, \"Selection\");\n"
2710" Offset = DrawRange(context, fRangeBegin, fRangeEnd, \'#009900\', \'#00ff00\', Offset, \"Cpu\");\n"
2711" Offset = DrawRange(context, fRangeBeginGpu, fRangeEndGpu, \'#996600\', \'#775500\', Offset, \"Gpu\");\n"
2712"\n"
2713" nHoverCSCpu = nHoverCSCpuNext;\n"
2714" ProfileLeave();\n"
2715"}\n"
2716"\n"
2717"function ZoomTo(fZoomBegin, fZoomEnd)\n"
2718"{\n"
2719" if(fZoomBegin < fZoomEnd)\n"
2720" {\n"
2721" AnimationActive = true;\n"
2722" var fDetailedOffsetOriginal = fDetailedOffset;\n"
2723" var fDetailedRangeOriginal = fDetailedRange;\n"
2724" var fDetailedOffsetTarget = fZoomBegin;\n"
2725" var fDetailedRangeTarget = fZoomEnd - fZoomBegin;\n"
2726" var TimestampStart = new Date();\n"
2727" var count = 0;\n"
2728" function ZoomFunc(Timestamp)\n"
2729" {\n"
2730" var fPrc = (new Date() - TimestampStart) / (ZOOM_TIME * 1000.0);\n"
2731" if(fPrc > 1.0)\n"
2732" {\n"
2733" fPrc = 1.0;\n"
2734" }\n"
2735" fPrc = Math.pow(fPrc, 0.3);\n"
2736" fDetailedOffset = fDetailedOffsetOriginal + (fDetailedOffsetTarget - fDetailedOffsetOriginal) * fPrc;\n"
2737" fDetailedRange = fDetailedRangeOriginal + (fDetailedRangeTarget - fDetailedRangeOriginal) * fPrc;\n"
2738" DrawDetailed(true);\n"
2739" if(fPrc >= 1.0)\n"
2740" {\n"
2741" AnimationActive = false;\n"
2742" fDetailedOffset = fDetailedOffsetTarget;\n"
2743" fDetailedRange = fDetailedRangeTarget;\n"
2744" }\n"
2745" else\n"
2746" {\n"
2747" requestAnimationFrame(ZoomFunc);\n"
2748" }\n"
2749" }\n"
2750" requestAnimationFrame(ZoomFunc);\n"
2751" }\n"
2752"}\n"
2753"function RequestRedraw()\n"
2754"{\n"
2755" Invalidate = 0;\n"
2756" Draw(1);\n"
2757"}\n"
2758"function Draw(RedrawMode)\n"
2759"{\n"
2760" if(ProfileMode)\n"
2761" {\n"
2762" ProfileModeClear();\n"
2763" ProfileEnter(\"Total\");\n"
2764" }\n"
2765" if(RedrawMode == 1)\n"
2766" {\n"
2767" if(Mode == ModeTimers)\n"
2768" {\n"
2769" DrawBarView();\n"
2770" DrawHoverToolTip();\n"
2771" }\n"
2772" else if(Mode == ModeDetailed)\n"
2773" {\n"
2774" DrawDetailed(false);\n"
2775" DrawHoverToolTip();\n"
2776" }\n"
2777" }\n"
2778" DrawDetailedFrameHistory();\n"
2779"\n"
2780" if(ProfileMode)\n"
2781" {\n"
2782" ProfileLeave();\n"
2783" ProfileModeDraw(CanvasDetailedView);\n"
2784" }\n"
2785"}\n"
2786"\n"
2787"function AutoRedraw(Timestamp)\n"
2788"{\n"
2789" var RedrawMode = 0;\n"
2790" if(Mode == ModeDetailed)\n"
2791" {\n"
2792" if(ProfileMode == 2 || ((nHoverCSCpu >= 0 || nHoverToken != -1) && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)||(Invalidate<2 && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton))\n"
2793" {\n"
2794" RedrawMode = 1;\n"
2795" }\n"
2796" }\n"
2797" else\n"
2798" {\n"
2799" if(Invalidate < 1)\n"
2800" {\n"
2801" RedrawMode = 1;\n"
2802" }\n"
2803" }\n"
2804" if(RedrawMode)\n"
2805" {\n"
2806" Draw(RedrawMode);\n"
2807" }\n"
2808" else if(FlashFrameCounter>0)\n"
2809" {\n"
2810" Draw(0);\n"
2811" }\n"
2812" requestAnimationFrame(AutoRedraw);\n"
2813"}\n"
2814"\n"
2815"\n"
2816"function ZoomGraph(nZoom)\n"
2817"{\n"
2818" var fOldRange = fDetailedRange;\n"
2819" if(nZoom>0)\n"
2820" {\n"
2821" fDetailedRange *= Math.pow(nModDown ? 1.40 : 1.03, nZoom);\n"
2822" }\n"
2823" else\n"
2824" {\n"
2825" var fNewDetailedRange = fDetailedRange / Math.pow((nModDown ? 1.40 : 1.03), -nZoom);\n"
2826" if(fNewDetailedRange < 0.0001) //100ns\n"
2827" fNewDetailedRange = 0.0001;\n"
2828" fDetailedRange = fNewDetailedRange;\n"
2829" }\n"
2830"\n"
2831" var fDiff = fOldRange - fDetailedRange;\n"
2832" var fMousePrc = DetailedViewMouseX / nWidth;\n"
2833" if(fMousePrc < 0)\n"
2834" {\n"
2835" fMousePrc = 0;\n"
2836" }\n"
2837" fDetailedOffset += fDiff * fMousePrc;\n"
2838"\n"
2839"}\n"
2840"\n"
2841"function MeasureFont()\n"
2842"{\n"
2843" var context = CanvasDetailedView.getContext(\'2d\');\n"
2844" context.font = Font;\n"
2845" FontWidth = context.measureText(\'W\').width;\n"
2846"\n"
2847"}\n"
2848"function ResizeCanvas() \n"
2849"{\n"
2850" nWidth = window.innerWidth;\n"
2851" nHeight = window.innerHeight - CanvasHistory.height-2;\n"
2852" DPR = window.devicePixelRatio;\n"
2853"\n"
2854" if(DPR)\n"
2855" {\n"
2856" CanvasDetailedView.style.width = nWidth + \'px\'; \n"
2857" CanvasDetailedView.style.height = nHeight + \'px\';\n"
2858" CanvasDetailedView.width = nWidth * DPR;\n"
2859" CanvasDetailedView.height = nHeight * DPR;\n"
2860" CanvasHistory.style.width = window.innerWidth + \'px\';\n"
2861" CanvasHistory.style.height = 70 + \'px\';\n"
2862" CanvasHistory.width = window.innerWidth * DPR;\n"
2863" CanvasHistory.height = 70 * DPR;\n"
2864" CanvasHistory.getContext(\'2d\').scale(DPR,DPR);\n"
2865" CanvasDetailedView.getContext(\'2d\').scale(DPR,DPR);\n"
2866"\n"
2867" CanvasDetailedOffscreen.style.width = nWidth + \'px\';\n"
2868" CanvasDetailedOffscreen.style.height = nHeight + \'px\';\n"
2869" CanvasDetailedOffscreen.wid";
2870
2871const size_t g_MicroProfileHtml_end_1_size = sizeof(g_MicroProfileHtml_end_1);
2872const char g_MicroProfileHtml_end_2[] =
2873"th = nWidth * DPR;\n"
2874" CanvasDetailedOffscreen.height = nHeight * DPR;\n"
2875" CanvasDetailedOffscreen.getContext(\'2d\').scale(DPR,DPR);\n"
2876"\n"
2877" }\n"
2878" else\n"
2879" {\n"
2880" DPR = 1;\n"
2881" CanvasDetailedView.width = nWidth;\n"
2882" CanvasDetailedView.height = nHeight;\n"
2883" CanvasDetailedOffscreen.width = nWidth;\n"
2884" CanvasDetailedOffscreen.height = nHeight;\n"
2885" CanvasHistory.width = window.innerWidth;\n"
2886" }\n"
2887" RequestRedraw();\n"
2888"}\n"
2889"\n"
2890"var MouseDragOff = 0;\n"
2891"var MouseDragDown = 1;\n"
2892"var MouseDragUp = 2;\n"
2893"var MouseDragMove = 3;\n"
2894"var MouseDragState = MouseDragOff;\n"
2895"var MouseDragTarget = 0;\n"
2896"var MouseDragButton = 0;\n"
2897"var MouseDragKeyShift = 0;\n"
2898"var MouseDragKeyCtrl = 0;\n"
2899"var MouseDragX = 0;\n"
2900"var MouseDragY = 0;\n"
2901"var MouseDragXLast = 0;\n"
2902"var MouseDragYLast = 0;\n"
2903"var MouseDragXStart = 0;\n"
2904"var MouseDragYStart = 0;\n"
2905"\n"
2906"function clamp(number, min, max)\n"
2907"{\n"
2908" return Math.max(min, Math.min(number, max));\n"
2909"}\n"
2910"\n"
2911"function MouseDragPan()\n"
2912"{\n"
2913" return MouseDragButton == 1 || MouseDragKeyShift;\n"
2914"}\n"
2915"function MouseDragSelectRange()\n"
2916"{\n"
2917" return MouseDragState == MouseDragMove && (MouseDragButton == 3 || (MouseDragKeyShift && MouseDragKeyCtrl));\n"
2918"}\n"
2919"function MouseHandleDrag()\n"
2920"{\n"
2921" if(MouseDragTarget == CanvasDetailedView)\n"
2922" {\n"
2923" if(Mode == ModeDetailed)\n"
2924" {\n"
2925" if(MouseDragSelectRange())\n"
2926" {\n"
2927" var xStart = MouseDragXStart;\n"
2928" var xEnd = MouseDragX;\n"
2929" if(xStart > xEnd)\n"
2930" {\n"
2931" var Temp = xStart;\n"
2932" xStart = xEnd;\n"
2933" xEnd = Temp;\n"
2934" }\n"
2935" if(xEnd - xStart > 1)\n"
2936" {\n"
2937" fRangeBegin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n"
2938" fRangeEnd = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n"
2939" fRangeBeginSelect = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n"
2940" fRangeEndSelect = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n"
2941" }\n"
2942" }\n"
2943" else if(MouseDragPan())\n"
2944" {\n"
2945" var X = MouseDragX - MouseDragXLast;\n"
2946" var Y = MouseDragY - MouseDragYLast;\n"
2947" if(X)\n"
2948" {\n"
2949" fDetailedOffset += -X * fDetailedRange / nWidth;\n"
2950" }\n"
2951" nOffsetY -= Y;\n"
2952" if(nOffsetY < 0)\n"
2953" {\n"
2954" nOffsetY = 0;\n"
2955" }\n"
2956" }\n"
2957" else if(MouseDragKeyCtrl)\n"
2958" {\n"
2959" if(MouseDragY != MouseDragYLast)\n"
2960" {\n"
2961" ZoomGraph(MouseDragY - MouseDragYLast);\n"
2962" }\n"
2963" }\n"
2964" }\n"
2965" else if(Mode == ModeTimers)\n"
2966" {\n"
2967" if(MouseDragKeyShift || MouseDragButton == 1)\n"
2968" {\n"
2969" var X = MouseDragX - MouseDragXLast;\n"
2970" var Y = MouseDragY - MouseDragYLast;\n"
2971" nOffsetBarsY -= Y;\n"
2972" nOffsetBarsX -= X;\n"
2973" if(nOffsetBarsY < 0)\n"
2974" {\n"
2975" nOffsetBarsY = 0;\n"
2976" }\n"
2977" if(nOffsetBarsX < 0)\n"
2978" {\n"
2979" nOffsetBarsX = 0;\n"
2980" }\n"
2981" }\n"
2982"\n"
2983" }\n"
2984"\n"
2985" }\n"
2986" else if(MouseDragTarget == CanvasHistory)\n"
2987" {\n"
2988" function HistoryFrameTime(x)\n"
2989" {\n"
2990" var NumFrames = Frames.length;\n"
2991" var fBarWidth = nWidth / NumFrames;\n"
2992" var Index = clamp(Math.floor(NumFrames * x / nWidth), 0, NumFrames-1);\n"
2993" var Lerp = clamp((x/fBarWidth - Index) , 0, 1);\n"
2994" var time = Frames[Index].framestart + (Frames[Index].frameend - Frames[Index].framestart) * Lerp;\n"
2995" return time;\n"
2996" }\n"
2997" if(MouseDragSelectRange())\n"
2998" {\n"
2999" fRangeBegin = fRangeEnd = -1;\n"
3000"\n"
3001" var xStart = MouseDragXStart;\n"
3002" var xEnd = MouseDragX;\n"
3003" if(xStart > xEnd)\n"
3004" {\n"
3005" var Temp = xStart;\n"
3006" xStart = xEnd;\n"
3007" xEnd = Temp;\n"
3008" }\n"
3009" if(xEnd - xStart > 2)\n"
3010" {\n"
3011" var timestart = HistoryFrameTime(xStart);\n"
3012" var timeend = HistoryFrameTime(xEnd);\n"
3013" fDetailedOffset = timestart;\n"
3014" fDetailedRange = timeend-timestart;\n"
3015" }\n"
3016" }\n"
3017" else if(MouseDragPan())\n"
3018" {\n"
3019" var Time = HistoryFrameTime(MouseDragX);\n"
3020" fDetailedOffset = Time - fDetailedRange / 2.0;\n"
3021" }\n"
3022" }\n"
3023"}\n"
3024"function MouseHandleDragEnd()\n"
3025"{\n"
3026" if(MouseDragTarget == CanvasDetailedView)\n"
3027" {\n"
3028"\n"
3029" }\n"
3030" else if(MouseDragTarget == CanvasHistory)\n"
3031" {\n"
3032" if(!MouseDragSelectRange() && !MouseDragPan())\n"
3033" {\n"
3034" ZoomTo(fRangeBegin, fRangeEnd);\n"
3035" fRangeBegin = fRangeEnd = -1;\n"
3036" }\n"
3037"\n"
3038"\n"
3039" }\n"
3040"\n"
3041"}\n"
3042"\n"
3043"function MouseHandleDragClick()\n"
3044"{\n"
3045" if(MouseDragTarget == CanvasDetailedView)\n"
3046" {\n"
3047" ZoomTo(fRangeBegin, fRangeEnd);\n"
3048" }\n"
3049" else if(MouseDragTarget == CanvasHistory)\n"
3050" {\n"
3051" if(Mode == ModeDetailed)\n"
3052" {\n"
3053" ZoomTo(fRangeBegin, fRangeEnd);\n"
3054" }\n"
3055" }\n"
3056"}\n"
3057"\n"
3058"function MapMouseButton(Event)\n"
3059"{\n"
3060" if(event.button == 1 || event.which == 1)\n"
3061" {\n"
3062" return 1;\n"
3063" }\n"
3064" else if(event.button == 3 || event.which == 3)\n"
3065" {\n"
3066" return 3;\n"
3067" }\n"
3068" else\n"
3069" {\n"
3070" return 0;\n"
3071" }\n"
3072"}\n"
3073"\n"
3074"function MouseDragReset()\n"
3075"{\n"
3076" MouseDragState = MouseDragOff;\n"
3077" MouseDragTarget = 0;\n"
3078" MouseDragKeyShift = 0;\n"
3079" MouseDragKeyCtrl = 0;\n"
3080" MouseDragButton = 0;\n"
3081"}\n"
3082"function MouseDragKeyUp()\n"
3083"{\n"
3084" if((MouseDragKeyShift && !KeyShiftDown) || (MouseDragKeyCtrl && !KeyCtrlDown))\n"
3085" {\n"
3086" MouseHandleDragEnd();\n"
3087" MouseDragReset();\n"
3088" }\n"
3089"}\n"
3090"function MouseDrag(Source, Event)\n"
3091"{\n"
3092" if(Source == MouseDragOff || (MouseDragTarget && MouseDragTarget != Event.target))\n"
3093" {\n"
3094" MouseDragReset();\n"
3095" return;\n"
3096" }\n"
3097"\n"
3098" var LocalRect = Event.target.getBoundingClientRect();\n"
3099" MouseDragX = Event.clientX - LocalRect.left;\n"
3100" MouseDragY = Event.clientY - LocalRect.top;\n"
3101" // console.log(\'cur drag state \' + MouseDragState + \' Source \' + Source);\n"
3102" if(MouseDragState == MouseDragMove)\n"
3103" {\n"
3104" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"
3105" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"
3106" if((Source == MouseDragUp && MapMouseButton(Event) == MouseDragButton) ||\n"
3107" (MouseDragKeyCtrl && !KeyCtrlDown) ||\n"
3108" (MouseDragKeyShift && !KeyShiftDown))\n"
3109" {\n"
3110" MouseHandleDragEnd();\n"
3111" MouseDragReset();\n"
3112" return;\n"
3113" }\n"
3114" else\n"
3115" {\n"
3116" MouseHandleDrag();\n"
3117" }\n"
3118" }\n"
3119" else if(MouseDragState == MouseDragOff)\n"
3120" {\n"
3121" if(Source == MouseDragDown || KeyShiftDown || KeyCtrlDown)\n"
3122" {\n"
3123" MouseDragTarget = Event.target;\n"
3124" MouseDragButton = MapMouseButton(Event);\n"
3125" MouseDragState = MouseDragDown;\n"
3126" MouseDragXStart = MouseDragX;\n"
3127" MouseDragYStart = MouseDragY;\n"
3128" MouseDragKeyCtrl = 0;\n"
3129" MouseDragKeyShift = 0;\n"
3130"\n"
3131" if(KeyShiftDown || KeyCtrlDown)\n"
3132" {\n"
3133" MouseDragKeyShift = KeyShiftDown;\n"
3134" MouseDragKeyCtrl = KeyCtrlDown;\n"
3135" MouseDragState = MouseDragMove;\n"
3136" }\n"
3137" }\n"
3138" }\n"
3139" else if(MouseDragState == MouseDragDown)\n"
3140" {\n"
3141" if(Source == MouseDragUp)\n"
3142" {\n"
3143" MouseHandleDragClick();\n"
3144" MouseDragReset();\n"
3145" }\n"
3146" else if(Source == MouseDragMove)\n"
3147" {\n"
3148" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"
3149" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"
3150" if(dx+dy>1)\n"
3151" {\n"
3152" MouseDragState = MouseDragMove;\n"
3153" }\n"
3154" }\n"
3155" }\n"
3156" MouseDragXLast = MouseDragX;\n"
3157" MouseDragYLast = MouseDragY;\n"
3158"}\n"
3159"\n"
3160"function MouseMove(evt)\n"
3161"{\n"
3162" evt.preventDefault();\n"
3163" MouseDrag(MouseDragMove, evt);\n"
3164" MouseHistory = 0;\n"
3165" MouseDetailed = 0;\n"
3166" HistoryViewMouseX = HistoryViewMouseY = -1;\n"
3167" var rect = evt.target.getBoundingClientRect();\n"
3168" var x = evt.clientX - rect.left;\n"
3169" var y = evt.clientY - rect.top;\n"
3170" if(evt.target == CanvasDetailedView)\n"
3171" {\n"
3172" if(!MouseDragSelectRange())\n"
3173" {\n"
3174" fRangeBegin = fRangeEnd = -1;\n"
3175" }\n"
3176" DetailedViewMouseX = x;\n"
3177" DetailedViewMouseY = y;\n"
3178" }\n"
3179" else if(evt.target = CanvasHistory)\n"
3180" {\n"
3181" var Rect = CanvasHistory.getBoundingClientRect();\n"
3182" HistoryViewMouseX = x;\n"
3183" HistoryViewMouseY = y;\n"
3184" }\n"
3185" Draw(1);\n"
3186"}\n"
3187"\n"
3188"function MouseButton(bPressed, evt)\n"
3189"{\n"
3190" evt.preventDefault();\n"
3191" MouseDrag(bPressed ? MouseDragDown : MouseDragUp, evt);\n"
3192"}\n"
3193"\n"
3194"function MouseOut(evt)\n"
3195"{\n"
3196" MouseDrag(MouseDragOff, evt);\n"
3197" KeyCtrlDown = 0;\n"
3198" KeyShiftDown = 0;\n"
3199" MouseDragButton = 0;\n"
3200" nHoverToken = -1;\n"
3201" fRangeBegin = fRangeEnd = -1;\n"
3202"}\n"
3203"\n"
3204"function MouseWheel(e)\n"
3205"{\n"
3206" var e = window.event || e;\n"
3207" var delta = (e.wheelDelta || e.detail * (-120));\n"
3208" ZoomGraph((-4 * delta / 120.0) | 0);\n"
3209" Draw(1);\n"
3210"}\n"
3211"\n"
3212"\n"
3213"function KeyUp(evt)\n"
3214"{\n"
3215" if(evt.keyCode == 17)\n"
3216" {\n"
3217" KeyCtrlDown = 0;\n"
3218" MouseDragKeyUp();\n"
3219" }\n"
3220" else if(evt.keyCode == 16)\n"
3221" {\n"
3222" KeyShiftDown = 0;\n"
3223" MouseDragKeyUp();\n"
3224" }\n"
3225" if(evt.keyCode == 18)\n"
3226" {\n"
3227" FlipToolTip = 0;\n"
3228" }\n"
3229" if(evt.keyCode == 32)\n"
3230" {\n"
3231" if(fRangeBeginSelect < fRangeEndSelect)\n"
3232" {\n"
3233" ZoomTo(fRangeBeginSelect, fRangeEndSelect);\n"
3234" fRangeBeginSelect = fRangeEndSelect = -1;\n"
3235" MouseHandleDragEnd();\n"
3236" }\n"
3237" }\n"
3238" if(evt.keyCode == 27)\n"
3239" {\n"
3240" fRangeBeginSelect = fRangeEndSelect = -1; \n"
3241" }\n"
3242" Invalidate = 0;\n"
3243"}\n"
3244"\n"
3245"function KeyDown(evt)\n"
3246"{\n"
3247" if(evt.keyCode == 18)\n"
3248" {\n"
3249" FlipToolTip = 1;\n"
3250" }\n"
3251" if(evt.keyCode == 17)\n"
3252" {\n"
3253" KeyCtrlDown = 1;\n"
3254" }\n"
3255" else if(evt.keyCode == 16)\n"
3256" {\n"
3257" KeyShiftDown = 1;\n"
3258" }\n"
3259" Invalidate = 0;\n"
3260"}\n"
3261"\n"
3262"function ReadCookie()\n"
3263"{\n"
3264" var result = document.cookie.match(/fisk=([^;]+)/);\n"
3265" var NewMode = ModeDetailed;\n"
3266" var ReferenceTimeString = \'33ms\';\n"
3267" if(result && result.length > 0)\n"
3268" {\n"
3269" var Obj = JSON.parse(result[1]);\n"
3270" if(Obj.Mode)\n"
3271" {\n"
3272" NewMode = Obj.Mode;\n"
3273" }\n"
3274" if(Obj.ReferenceTime)\n"
3275" {\n"
3276" ReferenceTimeString = Obj.ReferenceTime;\n"
3277" }\n"
3278" if(Obj.ThreadsAllActive || Obj.ThreadsAllActive == 0 || Obj.ThreadsAllActive == false)\n"
3279" {\n"
3280" ThreadsAllActive = Obj.ThreadsAllActive;\n"
3281" }\n"
3282" else\n"
3283" {\n"
3284" ThreadsAllActive = 1;\n"
3285" }\n"
3286" if(Obj.ThreadsActive)\n"
3287" {\n"
3288" ThreadsActive = Obj.ThreadsActive;\n"
3289" }\n"
3290" if(Obj.GroupsAllActive || Obj.GroupsAllActive == 0 || Obj.GroupsAllActive)\n"
3291" {\n"
3292" GroupsAllActive = Obj.GroupsAllActive;\n"
3293" }\n"
3294" else\n"
3295" {\n"
3296" GroupsAllActive = 1;\n"
3297" }\n"
3298" if(Obj.GroupsActive)\n"
3299" {\n"
3300" GroupsActive = Obj.GroupsActive;\n"
3301" }\n"
3302" if(Obj.nContextSwitchEnabled)\n"
3303" {\n"
3304" nContextSwitchEnabled = Obj.nContextSwitchEnabled; \n"
3305" }\n"
3306" else\n"
3307" {\n"
3308" nContextSwitchEnabled = 1;\n"
3309" }\n"
3310" if(Obj.GroupColors)\n"
3311" {\n"
3312" GroupColors = Obj.GroupColors;\n"
3313" }\n"
3314" else\n"
3315" {\n"
3316" GroupColors = 0;\n"
3317" }\n"
3318" if(Obj.nHideHelp)\n"
3319" {\n"
3320" nHideHelp = 1;\n"
3321" }\n"
3322" TimersGroups = Obj.TimersGroups?Obj.TimersGroups:0;\n"
3323" TimersMeta = Obj.TimersMeta?0:1;\n"
3324" }\n"
3325" SetContextSwitch(nContextSwitchEnabled);\n"
3326" SetMode(NewMode, TimersGroups);\n"
3327" SetReferenceTime(ReferenceTimeString);\n"
3328" UpdateOptionsMenu();\n"
3329" UpdateGroupColors();\n"
3330"}\n"
3331"function WriteCookie()\n"
3332"{\n"
3333" var Obj = new Object();\n"
3334" Obj.Mode = Mode;\n"
3335" Obj.ReferenceTime = ReferenceTime + \'ms\';\n"
3336" Obj.ThreadsActive = ThreadsActive;\n"
3337" Obj.ThreadsAllActive = ThreadsAllActive;\n"
3338" Obj.GroupsActive = GroupsActive;\n"
3339" Obj.GroupsAllActive = GroupsAllActive;\n"
3340" Obj.nContextSwitchEnabled = nContextSwitchEnabled;\n"
3341" Obj.TimersGroups = TimersGroups?TimersGroups:0;\n"
3342" Obj.TimersMeta = TimersMeta?0:1;\n"
3343" Obj.GroupColors = GroupColors;\n"
3344" if(nHideHelp)\n"
3345" {\n"
3346" Obj.nHideHelp = 1;\n"
3347" }\n"
3348" var date = new Date();\n"
3349" date.setFullYear(2099);\n"
3350" var cookie = \'fisk=\' + JSON.stringify(Obj) + \';expires=\' + date;\n"
3351" document.cookie = cookie;\n"
3352"}\n"
3353"\n"
3354"var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? \"DOMMouseScroll\" : \"mousewheel\" //FF doesn\'t recognize mousewheel as of FF3.x\n"
3355"\n"
3356"CanvasDetailedView.addEventListener(\'mousemove\', MouseMove, false);\n"
3357"CanvasDetailedView.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"
3358"CanvasDetailedView.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"
3359"CanvasDetailedView.addEventListener(\'mouseout\', MouseOut);\n"
3360"CanvasDetailedView.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"
3361"CanvasDetailedView.addEventListener(mousewheelevt, MouseWheel, false);\n"
3362"CanvasHistory.addEventListener(\'mousemove\', MouseMove);\n"
3363"CanvasHistory.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"
3364"CanvasHistory.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"
3365"CanvasHistory.addEventListener(\'mouseout\', MouseOut);\n"
3366"CanvasHistory.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"
3367"CanvasHistory.addEventListener(mousewheelevt, MouseWheel, false);\n"
3368"window.addEventListener(\'keydown\', KeyDown);\n"
3369"window.addEventListener(\'keyup\', KeyUp);\n"
3370"window.addEventListener(\'resize\', ResizeCanvas, false);\n"
3371"\n"
3372"function CalcAverage()\n"
3373"{\n"
3374" var Sum = 0;\n"
3375" var Count = 0;\n"
3376" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
3377" {\n"
3378" StackPos = 0;\n"
3379" for(var i = 0; i < Frames.length; i++)\n"
3380" {\n"
3381" var Frame_ = Frames[i]; \n"
3382" var tt = Frame_.tt[nLog];\n"
3383" var ts = Frame_.ts[nLog];\n"
3384"\n"
3385" var count = tt.length;\n"
3386" for(var j = 0; j < count; j++)\n"
3387" {\n"
3388" var type = tt[j];\n"
3389" var time = ts[j];\n"
3390" if(type == 1)\n"
3391" {\n"
3392" Stack[StackPos] = time;//store the frame which it comes from\n"
3393" StackPos++;\n"
3394" }\n"
3395" else if(type == 0)\n"
3396" {\n"
3397" if(StackPos>0)\n"
3398" {\n"
3399"\n"
3400" StackPos--;\n"
3401" var localtime = time - Stack[StackPos];\n"
3402" Count++;\n"
3403" Sum += localtime;\n"
3404" }\n"
3405" }\n"
3406" }\n"
3407" }\n"
3408" }\n"
3409" return Sum / Count;\n"
3410"\n"
3411"}\n"
3412"\n"
3413"function MakeLod(index, MinDelta, TimeArray, TypeArray, IndexArray, LogStart)\n"
3414"{\n"
3415" if(LodData[index])\n"
3416" {\n"
3417" console.log(\"error!!\");\n"
3418" }\n"
3419" // debugger;\n"
3420" var o = new Object();\n"
3421" o.MinDelta = MinDelta;\n"
3422" o.TimeArray = TimeArray;\n"
3423" o.TypeArray = TypeArray;\n"
3424" o.IndexArray = IndexArray;\n"
3425" o.LogStart = LogStart;\n"
3426" LodData[index] = o;\n"
3427"}\n"
3428"\n"
3429"function PreprocessBuildSplitArray()\n"
3430"{\n"
3431" var nNumLogs = Frames[0].ts.length;\n"
3432"\n"
3433" ProfileEnter(\"PreprocessBuildSplitArray\");\n"
3434" var SplitArrays = new Array(nNumLogs);\n"
3435"\n"
3436" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"
3437" {\n"
3438" console.log(\"source log \" + nLog + \" size \" + LodData[0].TypeArray[nLog].length);\n"
3439" }\n"
3440"\n"
3441"\n"
3442" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
3443" {\n"
3444" var MaxDepth = 1;\n"
3445" var StackPos = 0;\n"
3446" var Stack = Array(20);\n"
3447" var TypeArray = LodData[0].TypeArray[nLog];\n"
3448" var TimeArray = LodData[0].TimeArray[nLog];\n"
3449" var DeltaTimes = new Array(TypeArray.length);\n"
3450"\n"
3451" for(var j = 0; j < TypeArray.length; ++j)\n"
3452" {\n"
3453" var type = TypeArray[j];\n"
3454" var time = TimeArray[j];\n"
3455" if(type == 1)\n"
3456" {\n"
3457" //push\n"
3458" Stack[StackPos] = time;\n"
3459" StackPos++;\n"
3460" }\n"
3461" else if(type == 0)\n"
3462" {\n"
3463" if(StackPos>0)\n"
3464" {\n"
3465" StackPos--;\n"
3466" DeltaTimes[j] = time - Stack[StackPos];\n"
3467" }\n"
3468" else\n"
3469" {\n"
3470" DeltaTimes[j] = 0;\n"
3471" }\n"
3472" }\n"
3473" }\n"
3474" DeltaTimes.sort(function(a,b){return b-a;});\n"
3475" var SplitArray = Array(NumLodSplits);\n"
3476" var SplitIndex = DeltaTimes.length;\n"
3477"\n"
3478" var j = 0;\n"
3479" for(j = 0; j < NumLodSplits; ++j)\n"
3480" {\n"
3481" SplitIndex = Math.floor(SplitIndex / 2);\n"
3482" while(SplitIndex > 0 && !DeltaTimes[SplitIndex])\n"
3483" {\n"
3484" SplitIndex--;\n"
3485" }\n"
3486" if(SplitIndex < SplitMin)\n"
3487" {\n"
3488" break;\n"
3489" }\n"
3490" //search.. if 0\n"
3491" var SplitTime = DeltaTimes[SplitIndex];\n"
3492" if(SplitTime>=0)\n"
3493" {\n"
3494" SplitArray[j] = SplitTime;\n"
3495" }\n"
3496" else\n"
3497" {\n"
3498" SplitArray[j] = SPLIT_LIMIT;\n"
3499" }\n"
3500" if(j>0)\n"
3501" {\n"
3502" console.assert(SplitArray[j-1] <= SplitArray[j], \"must be less\");\n"
3503" }\n"
3504"\n"
3505" }\n"
3506" for(; j < NumLodSplits; ++j)\n"
3507" {\n"
3508" SplitArray[j] = SPLIT_LIMIT;\n"
3509" // console.log(\"split skipping \" + j + \" \" + SPLIT_LIMIT);\n"
3510" }\n"
3511"\n"
3512"\n"
3513" SplitArrays[nLog] = SplitArray;\n"
3514" }\n"
3515" ProfileLeave();\n"
3516" return SplitArrays;\n"
3517"}\n"
3518"\n"
3519"function PreprocessBuildDurationArray()\n"
3520"{\n"
3521" var nNumLogs = Frames[0].ts.length;\n"
3522" ProfileEnter(\"PreprocessBuildDurationArray\");\n"
3523" var DurationArrays = new Array(nNumLogs);\n"
3524" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"
3525" {\n"
3526" var MaxDepth = 1;\n"
3527" var StackPos = 0;\n"
3528" var Stack = Array(20);\n"
3529" var StackIndex = Array(20);\n"
3530" var TypeArray = LodData[0].TypeArray[nLog];\n"
3531" var TimeArray = LodData[0].TimeArray[nLog];\n"
3532" var DurationArray = Array(LodData[0].TypeArray[nLog].length);\n"
3533" for(var j = 0; j < TypeArray.length; ++j)\n"
3534" {\n"
3535" var type = TypeArray[j];\n"
3536" var time = TimeArray[j];\n"
3537" if(type == 1)\n"
3538" {\n"
3539" //push\n"
3540" Stack[StackPos] = time;\n"
3541" StackIndex[StackPos] = j;\n"
3542" StackPos++;\n"
3543" }\n"
3544" else if(type == 0)\n"
3545" {\n"
3546" if(StackPos>0)\n"
3547" {\n"
3548" StackPos--;\n"
3549" var Duration = time - Stack[StackPos];\n"
3550" DurationArray[StackIndex[StackPos]] = Duration;\n"
3551" DurationArray[j] = Duration;\n"
3552" }\n"
3553" else\n"
3554" {\n"
3555" DurationArray[j] = 0;\n"
3556" }\n"
3557" }\n"
3558" }\n"
3559" for(var j = 0; j < StackPos; ++j)\n"
3560" {\n"
3561" DurationArray[j] = 0;\n"
3562" }\n"
3563" DurationArrays[nLog] = DurationArray;\n"
3564" }\n"
3565" ProfileLeave();\n"
3566" return DurationArrays;\n"
3567"\n"
3568"}\n"
3569"function PreprocessLods()\n"
3570"{\n"
3571" ProfileEnter(\"PreprocessLods\");\n"
3572" var nNumLogs = Frames[0].ts.length;\n"
3573" var SplitArrays = PreprocessBuildSplitArray();\n"
3574" var DurationArrays = PreprocessBuildDurationArray();\n"
3575" var Source = LodData[0];\n"
3576" var SourceLogStart = Source.LogStart;\n"
3577" var NumFrames = SourceLogStart.length;\n"
3578"\n"
3579" for(var i = 0; i < NumLodSplits-1; ++i)\n"
3580" {\n"
3581" var DestLogStart = Array(SourceLogStart.length);\n"
3582" for(var j = 0; j < DestLogStart.length; ++j)\n"
3583" {\n"
3584" DestLogStart[j] = Array(nNumLogs);\n"
3585" }\n"
3586" var MinDelta = Array(nNumLogs);\n"
3587" var TimeArray = Array(nNumLogs);\n"
3588" var IndexArray = Array(nNumLogs);\n"
3589" var TypeArray = Array(nNumLogs);\n"
3590"\n"
3591"\n"
3592"\n"
3593" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"
3594" {\n"
3595" var SourceTypeArray = Source.TypeArray[nLog];\n"
3596" var SourceTimeArray = Source.TimeArray[nLog];\n"
3597" var SourceIndexArray = Source.IndexArray[nLog];\n"
3598" var Duration = DurationArrays[nLog];\n"
3599" console.assert(Duration.length == SourceTypeArray.length, \"must be equal!\");\n"
3600" var SplitTime = SplitArrays[nLog][i];\n"
3601"\n"
3602" MinDelta[nLog] = SplitTime;\n"
3603" if(SplitTime < SPLIT_LIMIT)\n"
3604" {\n"
3605" var SourceCount = SourceTypeArray.length;\n"
3606" var DestTypeArray = Array();\n"
3607" var DestTimeArray = Array();\n"
3608" var DestIndexArray = Array();\n"
3609" var RemapArray = Array(SourceCount);\n"
3610" var DiscardLast = 0;\n"
3611"\n"
3612" for(var j = 0; j < SourceCount; ++j)\n"
3613" {\n"
3614" RemapArray[j] = DestTypeArray.length;\n"
3615" if(Duration[j] >= SplitTime || (SourceTypeArray[j] == 3 && 0 == DiscardLast))\n"
3616" {\n"
3617" DiscardLast = 0;\n"
3618" DestTypeArray.push(SourceTypeArray[j]);\n"
3619" DestTimeArray.push(SourceTimeArray[j]);\n"
3620" DestIndexArray.push(SourceIndexArray[j]);\n"
3621" }\n"
3622" else\n"
3623" {\n"
3624" DiscardLast = 1;\n"
3625" }\n"
3626" }\n"
3627" TimeArray[nLog] = DestTimeArray;\n"
3628" IndexArray[nLog] = DestIndexArray;\n"
3629" TypeArray[nLog] = DestTypeArray;\n"
3630" for(var j = 0; j < NumFrames; ++j)\n"
3631" {\n"
3632" var OldStart = SourceLogStart[j][nLog];\n"
3633" var NewStart = RemapArray[OldStart];\n"
3634" var FrameArray = DestLogStart[j];\n"
3635" FrameArray[nLog] = NewStart;\n"
3636" }\n"
3637" }\n"
3638" else\n"
3639" {\n"
3640"\n"
3641" for(var j = 0; j < NumFrames; ++j)\n"
3642" {\n"
3643" var FrameArray = DestLogStart[j];\n"
3644" \n"
3645" FrameArray[nLog] = 0;\n"
3646" }\n"
3647"\n"
3648" }\n"
3649"\n"
3650" }\n"
3651" MakeLod(i+1, MinDelta, TimeArray, TypeArray, IndexArray, DestLogStart);\n"
3652" }\n"
3653" ProfileLeave();\n"
3654"}\n"
3655"function PreprocessGlobalArray()\n"
3656"{\n"
3657" ProfileEnter(\"PreprocessGlobalArray\");\n"
3658" var nNumLogs = Frames[0].ts.length;\n"
3659" var CaptureStart = Frames[0].framestart;\n"
3660" var CaptureEnd = Frames[Frames.length-1].frameend;\n"
3661" g_TypeArray = new Array(nNumLogs);\n"
3662" g_TimeArray = new Array(nNumLogs);\n"
3663" g_IndexArray = new Array(nNumLogs);\n"
3664" var StackPos = 0;\n"
3665" var Stack = Array(20);\n"
3666" var LogStartArray = new Array(Frames.length);\n"
3667" for(var i = 0; i < Frames.length; i++)\n"
3668" {\n"
3669" Frames[i].LogStart = new Array(nNumLogs); \n"
3670" LogStartArray[i] = Frames[i].LogStart;\n"
3671"\n"
3672" Frames[i].LogEnd = new Array(nNumLogs);\n"
3673" }\n"
3674" var MinDelta = Array(nNumLogs);\n"
3675" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
3676" {\n"
3677" MinDelta[nLog] = 0;\n"
3678" var Discard = 0;\n"
3679" var TypeArray = new Array();\n"
3680" var TimeArray = new Array();\n"
3681" var IndexArray = new Array();\n"
3682" for(var i = 0; i < Frames.length; i++)\n"
3683" {\n"
3684" var Frame_ = Frames[i]; \n"
3685" Frame_.LogStart[nLog] = TimeArray.length;\n"
3686" var FrameDiscard = Frame_.frameend + 33;//if timestamps are more than 33ms after current frame, we assume buffer has wrapped.\n"
3687" var tt = Frame_.tt[nLog];\n"
3688" var ts = Frame_.ts[nLog];\n"
3689" var ti = Frame_.ti[nLog];\n"
3690" var len = tt.length;\n"
3691" var DiscardLast = 0;\n"
3692" for(var xx = 0; xx < len; ++xx)\n"
3693" {\n"
3694" var Skip = (tt[i] == 3) ? DiscardLast : ts[xx] > FrameDiscard;\n"
3695" if(Skip)\n"
3696" {\n"
3697" Discard++;\n"
3698" DiscardLast = 1;\n"
3699" }\n"
3700" else\n"
3701" {\n"
3702" DiscardLast = 0;\n"
3703" TypeArray.push(tt[xx]);\n"
3704" TimeArray.push(ts[xx]);\n"
3705" IndexArray.push(ti[xx]);\n"
3706" }\n"
3707" }\n"
3708" Frame_.LogEnd[nLog] = TimeArray.length;\n"
3709" }\n"
3710" g_TypeArray[nLog] = TypeArray;\n"
3711" g_TimeArray[nLog] = TimeArray;\n"
3712" g_IndexArray[nLog] = IndexArray;\n"
3713" if(Discard)\n"
3714" {\n"
3715" console.log(\'discarded \' + Discard + \' markers from \' + ThreadNames[nLog]);\n"
3716" }\n"
3717" }\n"
3718" MakeLod(0, MinDelta, g_TimeArray, g_TypeArray, g_IndexArray, LogStartArray);\n"
3719" ProfileLeave();\n"
3720"}\n"
3721"\n"
3722"function PreprocessFindFirstFrames()\n"
3723"{\n"
3724" ProfileEnter(\"PreprocesFindFirstFrames\");\n"
3725" //create arrays that show how far back we need to start search in order to get all markers.\n"
3726" var nNumLogs = Frames[0].ts.length;\n"
3727" for(var i = 0; i < Frames.length; i++)\n"
3728" {\n"
3729" Frames[i].FirstFrameIndex = new Array(nNumLogs);\n"
3730" }\n"
3731"\n"
3732" var StackPos = 0;\n"
3733" var Stack = Array(20);\n"
3734" g_MaxStack = Array(nNumLogs);\n"
3735" \n"
3736" for(nLog = 0; nLog < nNumLogs; nLog++)\n"
3737" {\n"
3738" var MaxStack = 0;\n"
3739" StackPos = 0;\n"
3740" for(var i = 0; i < Frames.length; i++)\n"
3741" {\n"
3742" var Frame_ = Frames[i]; \n"
3743" var tt = Frame_.tt[nLog];\n"
3744" var count = tt.length;\n"
3745"\n"
3746" var FirstFrame = i;\n"
3747" if(StackPos>0)\n"
3748" {\n"
3749" FirstFrame = Stack[0];\n"
3750" }\n"
3751" Frames[i].FirstFrameIndex[nLog] = FirstFrame;\n"
3752"\n"
3753" for(var j = 0; j < count; j++)\n"
3754" {\n"
3755" var type = tt[j];\n"
3756" if(type == 1)\n"
3757" {\n"
3758" Stack[StackPos] = i;//store the frame which it comes from\n"
3759" StackPos++;\n"
3760" if(StackPos > MaxStack)\n"
3761" {\n"
3762" MaxStack = StackPos;\n"
3763" }\n"
3764" }\n"
3765" else if(type == 0)\n"
3766" {\n"
3767" if(StackPos>0)\n"
3768" {\n"
3769" StackPos--;\n"
3770" }\n"
3771" }\n"
3772" }\n"
3773" }\n"
3774" g_MaxStack[nLog] = MaxStack;\n"
3775" }\n"
3776" ProfileLeave();\n"
3777"}\n"
3778"function PreprocessMeta()\n"
3779"{\n"
3780" MetaLengths = Array(MetaNames.length);\n"
3781" MetaLengthsAvg = Array(MetaNames.length);\n"
3782" MetaLengthsMax = Array(MetaNames.length);\n"
3783" for(var i = 0; i < MetaNames.length; ++i)\n"
3784" {\n"
3785" MetaLengths[i] = MetaNames[i].length+1;\n"
3786" MetaLengthsAvg[i] = MetaNames[i].length+5;\n"
3787" MetaLengthsMax[i] = MetaNames[i].length+5;\n"
3788" if(MetaLengths[i]<12)\n"
3789" MetaLengths[i] = 12;\n"
3790" if(MetaLengthsAvg[i]<12)\n"
3791" MetaLengthsAvg[i] = 12;\n"
3792" if(MetaLengthsMax[i]<12)\n"
3793" MetaLengthsMax[i] = 12;\n"
3794" }\n"
3795" for(var i = 0; i < TimerInfo.length; ++i)\n"
3796" {\n"
3797" var Timer = TimerInfo[i];\n"
3798" for(var j = 0; j < MetaNames.length; ++j)\n"
3799" {\n"
3800" var Len = FormatMeta(Timer.meta[j],0).length + 2;\n"
3801" var LenAvg = FormatMeta(Timer.meta[j],2).length + 2;\n"
3802" var LenMax = FormatMeta(Timer.meta[j],0).length + 2;\n"
3803" if(Len > MetaLengths[j])\n"
3804" {\n"
3805" MetaLengths[j] = Len;\n"
3806" }\n"
3807" if(LenAvg > MetaLengthsAvg[j])\n"
3808" {\n"
3809" MetaLengthsAvg[j] = LenAvg;\n"
3810" }\n"
3811" if(LenMax > MetaLengthsMax[j])\n"
3812" {\n"
3813" MetaLengthsMax[j] = LenMax;\n"
3814" }\n"
3815" }\n"
3816" }\n"
3817"}\n"
3818"\n"
3819"function Preprocess()\n"
3820"{\n"
3821" var ProfileModeOld = ProfileMode;\n"
3822" ProfileMode = 1;\n"
3823" ProfileModeClear();\n"
3824" ProfileEnter(\"Preprocess\");\n"
3825" PreprocessCalculateAllTimers();\n"
3826" PreprocessFindFirstFrames();\n"
3827" PreprocessGlobalArray();\n"
3828" PreprocessLods();\n"
3829" PreprocessMeta();\n"
3830" PreprocessContextSwitchCache();\n"
3831" ProfileLeave();\n"
3832" ProfileModeDump();\n"
3833" ProfileMode = ProfileModeOld;\n"
3834" Initialized = 1;\n"
3835"}\n"
3836"\n"
3837"InitGroups();\n"
3838"ReadCookie();\n"
3839"MeasureFont()\n"
3840"InitThreadMenu();\n"
3841"InitGroupMenu();\n"
3842"InitFrameInfo();\n"
3843"UpdateThreadMenu();\n"
3844"ResizeCanvas();\n"
3845"Preprocess();\n"
3846"OnPageReady();\n"
3847"Draw(1);\n"
3848"AutoRedraw();\n"
3849"\n"
3850"</script>\n"
3851"</body>\n"
3852"</html> ";
3853
3854const size_t g_MicroProfileHtml_end_2_size = sizeof(g_MicroProfileHtml_end_2);
3855const char* g_MicroProfileHtml_end[] = {
3856&g_MicroProfileHtml_end_0[0],
3857&g_MicroProfileHtml_end_1[0],
3858&g_MicroProfileHtml_end_2[0],
3859};
3860size_t g_MicroProfileHtml_end_sizes[] = {
3861sizeof(g_MicroProfileHtml_end_0),
3862sizeof(g_MicroProfileHtml_end_1),
3863sizeof(g_MicroProfileHtml_end_2),
3864};
3865size_t g_MicroProfileHtml_end_count = 3;
3866#endif //MICROPROFILE_EMBED_HTML
3867
3868///end file generated from microprofile.html