Path: blob/a-new-beginning/SharedDependencies/Sources/microprofile/include/microprofile_html.h
2 views
///start file generated from microprofile.html1#ifdef MICROPROFILE_EMBED_HTML2const char g_MicroProfileHtml_begin_0[] =3"<!DOCTYPE HTML>\n"4"<html>\n"5"<head>\n"6"<title>MicroProfile Capture</title>\n"7"<style>\n"8"/* about css: http://bit.ly/1eMQ42U */\n"9"body {margin: 0px;padding: 0px; font: 12px Courier New;background-color:#343434; color:white;overflow:hidden;}\n"10"ul {list-style-type: none;margin: 0;padding: 0;}\n"11"li{display: inline; float:left;border:5px; position:relative;text-align:center;}\n"12"a {\n"13" float:left;\n"14" text-decoration:none;\n"15" display: inline;\n"16" text-align: center;\n"17" padding:5px;\n"18" padding-bottom:0px;\n"19" padding-top:0px;\n"20" color: #FFFFFF;\n"21" background-color: #343434;\n"22"}\n"23"a:hover, a:active{\n"24" background-color: #000000;\n"25"}\n"26"\n"27"ul ul {\n"28" position:absolute;\n"29" left:0;\n"30" top:100%;\n"31" margin-left:-999em;\n"32"}\n"33"li:hover ul {\n"34" margin-left:0;\n"35" margin-right:0;\n"36"}\n"37"ul li ul{ display:block;float:none;}\n"38"ul li ul li{ display:block;float:none;}\n"39"li li a{ display:block;float:none;text-align:left;word-break: keep-all;white-space: nowrap;}\n"40"#nav li:hover div {margin-left:0;}\n"41".dropzone {display:flex;justify-content:center;align-items:center;font-size:50px;position: fixed; top: 0; left: 0; z-index: 9999999999; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);transition: visibility 175ms, opacity 175ms;}\n"42".help {position:absolute;z-index:5;text-align:left;padding:2px;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".filterinput0{position:fixed;bottom:10px;left:25px;background-color: #313131}\n"46".filterinput1{position:fixed;bottom:10px;left:175px;background-color: #313131}\n"47".filterinputsearchdiv{position:fixed; background-color: #313131;display:none;}\n"48".filterinputsearchdivmenu{position:absolute; background-color: #313131;display:none;}\n"49".filterinputsearch{width:100px;}\n"50".filtersearchdiv{position:fixed;top:71px;right:75px; display:block;}\n"51".filterinputsearch2{width:100px; display:none}\n"52"</style>\n"53"</head>\n"54"<body style=\"\"> \n"55"<input type=\"file\" id=\"file-input\" style=\"display:none\"/>\n"56"<div style=\"visibility:hidden; opacity:0\" class=\"dropzone\" ondrop=\"DropHandler(event);\" ondragover=\"DragOverHandler(event);\">drop .html file to compare</div>\n"57"<div class=\"filtersearchdiv\" id=\"filtersearchdiv\"><input type=\"text\" id=\"FilterInputSearch2\" class=\"filterinputsearch2\"></div>\n"58"<div id=\'filterinput\'>\n"59"<div class=\"filterinput0\">Group<br><input type=\"text\" id=\"filtergroup\"></div>\n"60"<div class=\"filterinput1\">Timer/Thread<br><input type=\"text\" id=\"filtertimer\"></div>\n"61"</div>\n"62"<div class=\"filterinputsearchdiv\" id=\"FilterInputDiv\">Filter<br><input type=\"text\" id=\"FilterInput\" class=\"filterinputsearch\"></div>\n"63"<div class=\"filterinputsearchdivmenu\" id=\"FilterInputMenuDiv\">Filter<br><input type=\"text\" id=\"FilterInputMenu\" class=\"filterinputsearch\"></div>\n"64"<canvas id=\"History\" height=\"70\" style=\"background-color:#343434;margin:0px;padding:0px;\"></canvas>\n"65"<canvas id=\"DetailedView\" height=\"200\" style=\"background-color:#343434;margin:0px;padding:0px;\"></canvas>\n"66"<canvas id=\"CanvasMenu\" style=\"pointer-events:none;position:absolute;top:0;left:0;margin:0px;padding:0px;zIndex:1\" height=\"500\" width=\"500\"></canvas>\n"67"<div class=\"help\" id=\"divFrameInfo\" style=\"display:none;left:20px;top:300px;width:auto;\"></div>\n"68"<div class=\"helpstart\" id=\"helpwindow\" style=\"left:20px;top:20px\">\n"69"History View:<br>\n"70"Click + Drag: Pan View<br>\n"71"Right Click + Drag : Zoom on region<br>\n"72"Click Frame : Center on frame<br>\n"73"<hr>\n"74"Main View:<br>\n"75"Ctrl + Mouse up/down: Zoom<br>\n"76"Mousewheel : Zoom<br>\n"77"Right Click + Drag: Select region<br>\n"78"Ctrl + Shift + Drag: Select region<br>\n"79"Space: Zoom to Selection<br>\n"80"Ctrl + Drag: Pan<br>\n"81"Click + Drag: Pan<br>\n"82"hold alt: Show tooltip from timer view in detailed, detailed in timer<br>\n"83"x : Toggle View<br>\n"84"\\ : Switch color mode<br>\n"85"c : toggle collapse mode<br>\n"86"h : hightlight core types(context switch only)<br>\n"87"tab : go to filter view<br>\n"88"<hr>\n"89"Detailed View:<br>\n"90"Tab: Go To Worst Instance<br>\n"91"Left/Right Arror: Next/Prev Instance<br>\n"92"Enter: Search for timer in view<br>\n"93"<hr>\n"94"Timer Views:<br>\n"95"Tab: go to filtering<br>\n"96"Esc: Exit & Clear filter\n"97"<hr>\n"98"<table style=\"width:100%\">\n"99"<tr>\n"100"<td width=\"50%\" align=\"left\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 0);\">Close</a></td>\n"101"<td width=\"50%\" align=\"right\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 1);\">Close, Never Show</a></td>\n"102"</tr>\n"103"</table>\n"104"</div>\n"105"<script>\n"106"function ConvertRgbToHsl(hexTripletColor) //from https://gist.github.com/mjackson/5311256\n"107"{\n"108" var color = hexTripletColor;\n"109" color = color.substring(1);\n"110" color = parseInt(color, 16);\n"111" var r = ((color >> 16) % 256)/255.0;\n"112" var g = ((color >> 8) % 256)/255.0;\n"113" var b = ((color >> 0) % 256)/255.0;\n"114" var max = Math.max(r, g, b), min = Math.min(r, g, b);\n"115" var h, s, l = (max + min) / 2;\n"116" if (max == min) {\n"117" h = s = 0; // achromatic\n"118" }\n"119" else\n"120" {\n"121" var d = max - min;\n"122" s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n"123"\n"124" switch (max)\n"125" {\n"126" case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n"127" case g: h = (b - r) / d + 2; break;\n"128" case b: h = (r - g) / d + 4; break;\n"129" }\n"130" h /= 6;\n"131" }\n"132" return [ h, s, l ];\n"133"}\n"134"\n"135"function ConvertHslToColor(h, s, l) //from https://gist.github.com/mjackson/5311256\n"136"{\n"137" var r, g, b;\n"138" if (s == 0)\n"139" {\n"140" r = g = b = l; // achromatic\n"141" }\n"142" else\n"143" {\n"144" function hue2rgb(p, q, t)\n"145" {\n"146" if (t < 0) t += 1;\n"147" if (t > 1) t -= 1;\n"148" if (t < 1/6) return p + (q - p) * 6 * t;\n"149" if (t < 1/2) return q;\n"150" if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n"151" return p;\n"152" }\n"153" var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n"154" var p = 2 * l - q;\n"155" r = hue2rgb(p, q, h + 1/3);\n"156" g = hue2rgb(p, q, h);\n"157" b = hue2rgb(p, q, h - 1/3);\n"158" }\n"159" var color = ((r*255)<<16) | ((g*255)<<8) | (b*255);\n"160" return \'#\' + (\"000000\" + color.toString(16)).slice(-6);\n"161"}\n"162"\n"163"\n"164"function ConvertColorDark(hexTripletColor)\n"165"{\n"166" var color = hexTripletColor;\n"167" color = color.substring(1); // remove #\n"168" color = parseInt(color, 16); // convert to integer\n"169" // console.log(color.toString(16));\n"170" color = (color >> 1);\n"171" // console.log(color.toString(16));\n"172" color = color & 0x7f7f7f;\n"173" // console.log(color.toString(16));\n"174" return \'#\' + (\"000000\" + color.toString(16)).slice(-6);\n"175"}\n"176"function InvertColor(hexTripletColor)\n"177"{\n"178" var color = hexTripletColor;\n"179" color = color.substring(1); // remove #\n"180" color = parseInt(color, 16); // convert to integer\n"181" var R = ((color >> 16) % 256)/255.0;\n"182" var G = ((color >> 8) % 256)/255.0;\n"183" var B = ((color >> 0) % 256)/255.0;\n"184" var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n"185" if(lum < 0.7)\n"186" {\n"187" return \'#ffffff\';\n"188" }\n"189" else\n"190" {\n"191" return \'#333333\';\n"192" }\n"193"}\n"194"function InvertColorIndex(hexTripletColor) {\n"195" var color = hexTripletColor;\n"196" color = color.substring(1); // remove #\n"197" color = parseInt(color, 16); // convert to integer\n"198" var R = ((color >> 16) % 256)/255.0;\n"199" var G = ((color >> 8) % 256)/255.0;\n"200" var B = ((color >> 0) % 256)/255.0;\n"201" var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n"202" if(lum < 0.7)\n"203" {\n"204" return 0;\n"205" }\n"206" else\n"207" {\n"208" return 1;\n"209" }\n"210"}\n"211"\n"212"function MakeGroup(id, name, category, numtimers, isgpu, total, average, max, color)\n"213"{\n"214" if(color == \"\")\n"215" {\n"216" color = ColorFromString(name, 40, 50);\n"217" }\n"218" var cid = GetColorIndex(color);\n"219" var group = {\"id\":id, \"name\":name, \"category\":category, \"numtimers\":numtimers, \"isgpu\":isgpu, \"total\": total, \"average\" : average, \"max\" : max, \"cid\":cid};\n"220" return group;\n"221"}\n"222"\n"223"function MakeGroupCid(id, name, category, numtimers, isgpu, total, average, max, color, cid)\n"224"{\n"225" var group = {\"id\":id, \"name\":name, \"category\":category, \"numtimers\":numtimers, \"isgpu\":isgpu, \"total\": total, \"average\" : average, \"max\" : max, \"cid\":cid};\n"226" return group;\n"227"}\n"228"\n"229"function MakeTimer(id, name, group, color, colordark, average, max, min, exclaverage, exclmax, callaverage, callcount, total, meta, metaavg, metamax, flags)\n"230"{\n"231" if(color == \"#000000\")\n"232" {\n"233" color = ColorFromString(name + \"x\" + group, 40, 50);\n"234" colordark = ColorFromString(name + \"x\" + group, 25, 50);\n"235" }\n"236" var spike = max <= 0 || average <= 0 ? 0 : (100 * max / average);\n"237" var cid = GetColorIndex(color);\n"238" var timer = {\"id\":id, \"name\":name, \"len\":name.length, \"cid\":cid, \"timercid\":cid, \"group\":group, \"average\":average, \"max\":max, \"min\":min, \"exclaverage\":exclaverage, \"exclmax\":exclmax, \"callaverage\":callaverage, \"callcount\":callcount, \"spike\":spike,\"total\":total, \"meta\":meta, \"metaavg\":metaavg, \"metamax\":metamax, \"worst\":0, \"worststart\":0, \"worstend\":0, \"search\":cid, \"flags\":flags};\n"239" return timer;\n"240"}\n"241"\n"242"function MakeTimerCid(id, name, group, cid, average, max, min, exclaverage, exclmax, callaverage, callcount, total, meta, metaavg, metamax)\n"243"{\n"244" var spike = max <= 0 || average <= 0 ? 0 : (100 * max / average);\n"245" var timer = {\"id\":id, \"name\":name, \"len\":name.length, \"cid\":cid, \"timercid\":cid, \"group\":group, \"average\":average, \"max\":max, \"min\":min, \"exclaverage\":exclaverage, \"exclmax\":exclmax, \"callaverage\":callaverage, \"callcount\":callcount, \"spike\":spike,\"total\":total, \"meta\":meta, \"metaavg\":metaavg, \"metamax\":metamax, \"worst\":0, \"worststart\":0, \"worstend\":0};\n"246" return timer;\n"247"}\n"248"\n"249"function CloneTimer(T)\n"250"{\n"251" return MakeTimerCid(T.id, T.name, T.group, T.cid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n"252"}\n"253"function CloneGroup(G)\n"254"{\n"255" return MakeGroupCid(G.id, G.name, G.category, G.numtimers, G.isgpu, G.total, G.average, G.max, G.cid);\n"256"}\n"257"\n"258"function MakeFrame(id, framestart, frameend, framestartgpu, frameendgpu, ts, tt, ti)\n"259"{\n"260" var frame = {\"id\":id, \"framestart\":framestart, \"frameend\":frameend, \"framestartgpu\":framestartgpu, \"frameendgpu\":frameendgpu, \"ts\":ts, \"tt\":tt, \"ti\":ti};\n"261" return frame;\n"262"}\n"263"function MakeCounterHistory(id, history, prc)\n"264"{\n"265" var counterhistory = {\"id\":id, \"history\":history, \"prc\":prc};\n"266" return counterhistory;\n"267"}\n"268"function MakeCounter(id, parent, sibling, firstchild, level, name, value, minvalue, maxvalue, formatted, limit, formattedlimit, counterprc, boxprc, format, counterhistory)\n"269"{\n"270" var counter = { \"id\":id, \"parent\":parent, \"sibling\":sibling, \"firstchild\":firstchild, \"level\": level, \"name\":name, \"value\":value, \"formatted\":formatted, \"limit\":limit, \"formattedlimit\":formattedlimit, \"counterprc\":counterprc, \"boxprc\":boxprc, \"counterhistory\":counterhistory, \"format\":format, \"minvalue\":minvalue, \"maxvalue\":maxvalue};\n"271" return counter;\n"272"}\n"273"function Clamp(v, low, high)\n"274"{\n"275" return v < low ? low : (v > high ? high : v);\n"276"}\n"277"function FormatTime(Time)\n"278"{\n"279" return Time.toFixed(2);\n"280"}\n"281"\n"282"\n"283"\n"284"var g_ColorMap = {};\n"285"var g_Colors = new Array();\n"286"var g_ColorsDark = new Array();\n"287"var g_ColorsTextIndex = new Array();\n"288"var g_ColorH = new Array();\n"289"var g_ColorS = new Array();\n"290"var g_ColorL = new Array();\n"291"\n"292"function GetColorIndex(color)\n"293"{\n"294" if(g_ColorMap[color])\n"295" {\n"296" return g_ColorMap[color];\n"297" }\n"298" else\n"299" {\n"300" var idx = g_Colors.length;\n"301" g_ColorMap[color] = idx;\n"302" g_Colors.push(color);\n"303" g_ColorsDark.push(ConvertColorDark(color));\n"304" g_ColorsTextIndex.push(InvertColorIndex(color));\n"305" var hsl = ConvertRgbToHsl(color);\n"306" g_ColorH.push(hsl[0]);\n"307" g_ColorS.push(hsl[1]);\n"308" g_ColorL.push(hsl[2]);\n"309" return idx;\n"310" }\n"311"}\n"312"//color index 0 reserved for blinking\n"313"var cidhovercolor = 0;\n"314"g_Colors.push(\'#000000\');\n"315"g_ColorsDark.push(\'#000000\');\n"316"g_ColorsTextIndex.push(0);\n"317"g_ColorH.push(0);\n"318"g_ColorS.push(0);\n"319"g_ColorL.push(0);\n"320"\n"321"const CIDMatch = GetColorIndex(\"#AA3333\");\n"322"const CIDFail = GetColorIndex(\"#555555\");\n"323"\n"324"var S = {};\n"325"var S2 = {};\n"326"var Timeline = {};\n"327"S.TimelineArray = [];\n"328"S.TimelineIdArray = [];\n"329"S.TimelineNames = [];\n"330"S.TimelineColorArray = [];\n"331"\n"332"\n"333"\n"334"//EBEGIN\n"335"";336337const size_t g_MicroProfileHtml_begin_0_size = sizeof(g_MicroProfileHtml_begin_0);338const char* g_MicroProfileHtml_begin[] = {339&g_MicroProfileHtml_begin_0[0],340};341size_t g_MicroProfileHtml_begin_sizes[] = {342sizeof(g_MicroProfileHtml_begin_0),343};344size_t g_MicroProfileHtml_begin_count = 1;345const char g_MicroProfileHtml_end_0[] =346"\n"347"//EEND\n"348"\n"349"const MP_LOG_LEAVE=0x0;\n"350"const MP_LOG_ENTER=0x1;\n"351"const MP_LOG_EXTENDED=0x2;\n"352"const MP_LOG_EXTENDED_NO_DATA=0x3;\n"353"\n"354"const ETOKEN_GPU_CPU_TIMESTAMP=0x3fff;\n"355"const ETOKEN_GPU_CPU_SOURCE_THREAD=0x3ffe;\n"356"const ETOKEN_META_MARKER=0x3ffd;\n"357"const ETOKEN_CUSTOM_NAME=0x3ffc;\n"358"const ETOKEN_CUSTOM_COLOR=0x3ffb;\n"359"const ETOKEN_CUSTOM_ID=0x3ffa;\n"360"\n"361"const ETOKEN_CSTR_PTR = 0x2000;\n"362"const ETOKEN_MAX = 0x2000;\n"363"\n"364"\n"365"\n"366"var CanvasDetailedView = document.getElementById(\'DetailedView\');\n"367"var CanvasHistory = document.getElementById(\'History\');\n"368"var CanvasMenu = document.getElementById(\'CanvasMenu\');\n"369"var CanvasDetailedOffscreen = document.createElement(\'canvas\');\n"370"var FilterInputGroup = document.getElementById(\'filtergroup\');\n"371"var FilterInputTimer = document.getElementById(\'filtertimer\');\n"372"\n"373"var FilterInput = document.getElementById(\'FilterInput\');\n"374"var FilterInputDiv = document.getElementById(\'FilterInputDiv\');\n"375"var FilterInputDivPos = {\"x\":-1,\"y\":-1,\"w\":-1,\"h\":-1};\n"376"var FilterInputMenu = document.getElementById(\'FilterInputMenu\');\n"377"var FilterInputMenuDiv = document.getElementById(\'FilterInputMenuDiv\');\n"378"var FilterInputMenuDivPos = {\"x\":-1,\"y\":-1,\"w\":-1,\"h\":-1};\n"379"var FilterInputMenuValueLast = \'\';\n"380"\n"381"let FilterInputSearch2 = document.getElementById(\'FilterInputSearch2\');\n"382"FilterInputSearch2.value = \'\';\n"383"let FilterInputSearchValue = \'\';\n"384"let FilterInputSearchActive2 = 0;\n"385"\n"386"const FLAGS_SECTION = 1;\n"387"\n"388"\n"389"let LastDropTarget = null;\n"390"\n"391"var FilterInputGroupString = null;\n"392"var FilterInputTimerString = null;\n"393"var FilterInputArray = [FilterInputGroup, FilterInputTimer];\n"394"var FilterGroup = null;\n"395"var FilterTimer = null;\n"396"var g_Msg = \'0\';\n"397"\n"398"var RedrawRequested = 0;\n"399"var InsideDraw = 0;\n"400"\n"401"\n"402"\n"403"var Initialized = 0;\n"404"var fDetailedOffset = S.Frames[0].framestart;\n"405"var fDetailedOffsetSecond = 0;\n"406"var fDetailedRange = S.Frames[S.Frames.length-1].frameend - fDetailedOffset;\n"407"var nWidth = CanvasDetailedView.width;\n"408"var nHeight = CanvasDetailedView.height;\n"409"var ReferenceTimeString = \'100\';\n"410"var ReferenceTimeAutoString = \'auto\';\n"411"var ReferenceTime = 100;\n"412"var TargetTime = 15;\n"413"var TargetTimeString = \'15ms\';\n"414"var nHistoryHeight = 70;\n"415"var nOffsetY = 0;\n"416"var nOffsetBarsX = 0;\n"417"var nOffsetBarsY = 0;\n"418"var nOffsetCountersY = 0;\n"419"var nOffsetFilterSearch = 0;\n"420"var nOffsetMenuThreads = 0;\n"421"var nOffsetMenuGroups = 0;\n"422"var FilterInputSearchLast = \'\';\n"423"var nBarsWidth = 80;\n"424"var MouseButtonState = [0,0,0,0,0,0,0,0];\n"425"var KeyShiftDown = 0;\n"426"var KeyAltDown = 0;\n"427"var KeyCtrlDown = 0;\n"428"let KeyHDown = 0;\n"429"var MouseDragButton = 0;\n"430"var ToolTipFlip = 0;\n"431"var ToolTipCorner = 0;\n"432"let ToolTipImmediate = null;\n"433"var DetailedViewMouseX = 0;\n"434"var DetailedViewMouseY = 0;\n"435"var DetailedMouseOverButton = 0;\n"436"var DetailedMouseEvent = null;\n"437"var HistoryViewMouseX = -1;\n"438"var HistoryViewMouseY = -1;\n"439"var GlobalMouseX = -1;\n"440"var GlobalMouseY = -1;\n"441"var MouseReleased = false;\n"442"var MouseHistory = 0;\n"443"var MouseDetailed = 0;\n"444"const FontName = \'Courier New\';\n"445"const FontHeight = 10;\n"446"const FontHeightLarge = 22;\n"447"const FontHeightFlash = 35;\n"448"let FontWidth = 1;\n"449"const FontAscent = 3; //Set manually\n"450"const Font = \'Bold \' + FontHeight + \'px \' + FontName;\n"451"const FontLarge = \'Bold \' + FontHeightLarge + \'px \' + FontName;\n"452"const FontFlash = \'Bold \' + FontHeightFlash + \'px \' + FontName;\n"453"const BoxHeight = FontHeight + 2;\n"454"let ThreadsHidden = {};\n"455"var GroupsDisabled = new Object();\n"456"var nMinWidth = 0.01;//subpixel width\n"457"var nMinWidthPan = 1.0;//subpixel width when panning\n"458"var nContextSwitchEnabled = 1;\n"459"var DisableLod = 0;\n"460"var DisableMerge = 0;\n"461"var GroupColors = 0;\n"462"var DrawDetailedFlameMode = 0;\n"463"var DrawDetailedNewDraw = 1;\n"464"var DrawDetailedCompareReverse = 1;\n"465"var nModDown = 0;\n"466"var g_MSG = \'no\';\n"467"var nDrawCount = 0;\n"468"var nBackColors = [\'#292929\', \'#343434\' ];\n"469"var nBackColorsDark = [\'#292929\', \'#272727\' ];\n"470"var nBackColorOffset = \'#404040\';\n"471"const CSwitchColors =[\"#EAAC76\",\"#8CE48B\",\"#C4D688\",\"#9DD8AF\",\"#D7B6DA\",\"#DBDA61\",\"#8AD5E1\",\"#57E5C4\"];//generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php\n"472"var CSwitchHeight = 5;\n"473"var FRAME_HISTORY_COLOR_CPU = \'#ff7f27\';\n"474"var FRAME_HISTORY_COLOR_GPU = \'#ffffff\';\n"475"var ZOOM_TIME = 0.5;\n"476"var AnimationActive = false;\n"477"var nHoverCSCpu = -1;\n"478"var nHoverCSCpuNext = -1;\n"479"var nHoverCSToolTip = null;\n"480"var nHoverToken = -1;\n"481"var HoverTokenOwner = null;\n"482"//var nHoverFrame = -1;\n"483"var nHoverTokenIndex = -1;\n"484"var nHoverTokenLogIndex = -1;\n"485"var nHoverCounter = 0;\n"486"var nHoverCounterDelta = 8;\n"487"var nHoverTokenNext = -1;\n"488"var nHoverTokenLogIndexNext = -1;\n"489"var nHoverTokenIndexNext = -1;\n"490"var HoverTokenNextOwner = null;\n"491"var nHoverCounter = -1;\n"492"var nHoverTokenDrawn = -1;\n"493"var nHideHelp = 0;\n"494"var fFrameScale = 33.33;\n"495"var SortColumn = 0;\n"496"var SortColumnOrderFlip = 0;\n"497"var SortColumnMouseOver = null;\n"498"var SortColumnMouseOverNext = null;\n"499"var ColumnsWidth = [];\n"500"var ColumnsEnabled = [];\n"501"let ColumnNames =[\"Average\", \"Max\", \"Total\", \"Min\", \"Spike\", \"Call Average\", \"Call Count\", \"Excl Average\", \"Excl Max\"];\n"502"let NumColumns = ColumnNames.length;\n"503"while(ColumnsEnabled.length < NumColumns)\n"504"{\n"505" ColumnsEnabled.push(1);\n"506" ColumnsWidth.push(20);\n"507"}\n"508"var FilterSearchActive = 0;\n"509"var FilterSearchSelection = -1;\n"510"var FilterSearchSelectionMax = 0;\n"511"var FilterSearchPassIndex = -1;\n"512"FilterSearchReset();\n"513"var FilterSearchStartTime = new Date();\n"514"var IgnoreInput = 0;\n"515"function RangeInit()\n"516"{\n"517" return {\"Begin\":-1, \"End\":-1, \"YBegin\":-1, \"YEnd\":-1, \"Thread\": -1 , \"Index\": -1, \"Off\": 0, \"Second\":0};\n"518"}\n"519"function RangeValid(Range)\n"520"{\n"521" return Range && Range.Begin < Range.End;\n"522"}\n"523"function RangeCopy(Dst, Src)\n"524"{\n"525" Dst.Begin = Src.Begin;\n"526" Dst.End = Src.End;\n"527" Dst.YBegin = Src.YBegin;\n"528" Dst.YEnd = Src.YEnd;\n"529" Dst.Thread = Src.Thread;\n"530" Dst.Off = Src.Off;\n"531" Dst.Second = Src.Second;\n"532"}\n"533"var RangeCpu = RangeInit();\n"534"var RangeGpu = RangeInit();\n"535"var RangeSelect = RangeInit();\n"536"\n"537"var RangeCpuNext = RangeInit();\n"538"var RangeGpuNext = RangeInit();\n"539"\n"540"var RangeCpuHistory = RangeInit();\n"541"var RangeGpuHistory = RangeInit();\n"542"\n"543"var fRangeBegin = 0;\n"544"var fRangeEnd = -1;\n"545"var fRangeThreadId = -1;\n"546"var fRangeThreadIdNext = -1;\n"547"var fRangeBeginNext = 0;\n"548"var fRangeEndNext = 0;\n"549"var fRangeBeginGpuNext = 0;\n"550"var fRangeEndGpuNext = 0;\n"551"var fRangeBeginHistory = -1;\n"552"var fRangeEndHistory = -1;\n"553"var fRangeBeginHistoryGpu = -1;\n"554"var fRangeEndHistoryGpu = -1;\n"555"var fRangeBeginSelect = 0;\n"556"var fRangeEndSelect = -1;\n"557"var ThreadYBegin;\n"558"var ThreadYEnd;\n"559"\n"560"var ModeDetailed = 0;\n"561"var ModeTimers = 1;\n"562"var ModeTimers_Threads = 2;\n"563"var ModeTimers_Groups = 3;\n"564"var ModeCounters = 4;\n"565"var ModeCount = 5;\n"566"var Mode = ModeDetailed;\n"567"\n"568"var DebugDrawQuadCount = 0;\n"569"var DebugDrawTextCount = 0;\n"570"var ProfileMode = 0;\n"571"var ProfileRedraw0 = 0;\n"572"var ProfileRedraw1 = 0;\n"573"var ProfileRedraw2 = 0;\n"574"var ProfileFps = 0;\n"575"var ProfileFpsAggr = 0;\n"576"var ProfileFpsCount = 0;\n"577"var ProfileLastTimeStamp = new Date();\n"578"\n"579"var ProfileData = {};\n"580"var ProfileStackTime = {};\n"581"var ProfileStackName = {};\n"582"let ProfileDrawStartLast = new Date();\n"583"let ProfileDrawEndLast = new Date();\n"584"function CreateEmptyFloatArray(Size)\n"585"{\n"586" let a = Array(Size);\n"587" for(let i = 0; i < Size; ++i)\n"588" a[i] = 0.0;\n"589" return a;\n"590"}\n"591"let ProfileDrawTime = CreateEmptyFloatArray(120);\n"592"let ProfileDeltaTime = CreateEmptyFloatArray(120);\n"593"let ProfileDraw2Draw = CreateEmptyFloatArray(120);\n"594"\n"595"var Debug = 1;\n"596"\n"597"var ThreadLogAutoHide = 0;\n"598"var NumLodSplits = 10;\n"599"var SplitMin = 100;\n"600"var SPLIT_LIMIT = 1e20;\n"601"var DPR = 1;\n"602"var DetailedRedrawState = {};\n"603"var OffscreenData;\n"604"var DetailedFrameCounter = 0;\n"605"var Invalidate = 0;\n"606"var GroupOrder = Array();\n"607"var ThreadOrder = Array();\n"608"var ThreadOrderNames = Array();\n"609"var ThreadOrderT = Array();\n"610"var MetaLengths = Array();\n"611"var MetaLengthsAvg = Array();\n"612"var MetaLengthsMax = Array();\n"613"\n"614"var ZoomActive = 0;\n"615"\n"616"var StrGroup = \"Group\";\n"617"var StrThread = \"Thread\";\n"618"var StrTimer = \"Timer\";\n"619"var StrAverage = \"Average\";\n"620"var StrMax = \"Max\";\n"621"var StrTotal = \"Total\";\n"622"var StrMin = \"Min\";\n"623"var StrSpike = \"Spike%\";\n"624"var StrCallAverage = \"Call Average\";\n"625"var StrCount = \"Count\";\n"626"var StrExclAverage = \"Excl Average\";\n"627"var StrExclMax = \"Excl Max\";\n"628"\n"629"var GroupRemapReverse = [];\n"630"var TimerRemapReverse = [];\n"631"var ThreadRemapReverse = [];\n"632"\n"633"let SubMenuHelp = 0;\n"634"let SubMenuMode = 1;\n"635"let SubMenuReference = 2;\n"636"let SubMenuTarget = 3;\n"637"let SubMenuThreads = 4;\n"638"let SubMenuGroups = 5;\n"639"let SubMenuColumns = 6;\n"640"let SubMenuOptions = 7;\n"641"let SubMenuCompare = 8;\n"642"\n"643"let MenuRedraw = 0;\n"644"let SubMenuActive = -1;\n"645"let SubMenuTimeoutBase = 0.7;\n"646"let SubMenuMouseX = 0;\n"647"let SubMenuMouseY = 0;\n"648"let SubMenuTimeout = new Date();\n"649"let MenuItems = [];\n"650"let FilterInputMenuThreadsValue = \'\';\n"651"let FilterInputMenuGroupsValue = \'\';\n"652"let MouseMoveTime = new Date();\n"653"let ReferenceTimes = [-1, 5, 10, 15, 16, 20, 30, 33, 50, 100, 250, 500, 1000];\n"654"let TargetTimes = [5, 10, 15, 16, 20, 30, 33, 50, 100, 250, 500, 1000];\n"655"let ModeItems = [\"Detailed\", \"Timers\", \"Threads\", \"Groups\", \"Counters\"];\n"656"let HideModeFullyHidden = 0;\n"657"let HideModeCollapsed = 1;\n"658"let HideMode = HideModeCollapsed;\n"659"\n"660"\n"661"function ProfileModeClear()\n"662"{\n"663" if(ProfileMode)\n"664" {\n"665" ProfileData = new Object();\n"666" ProfileStackTime = new Array();\n"667" ProfileStackName = new Array();\n"668" }\n"669"}\n"670"function ProfileEnter(Name)\n"671"{\n"672" if(ProfileMode)\n"673" {\n"674" ProfileStackTime.push(new Date());\n"675" ProfileStackName.push(Name);\n"676" }\n"677"}\n"678"function ProfileLeave()\n"679"{\n"680" if(ProfileMode)\n"681" {\n"682" var Time = new Date();\n"683" var Delta = Time - ProfileStackTime.pop();\n"684" var Name = ProfileStackName.pop();\n"685" var Obj = ProfileData[Name];\n"686" if(!Obj)\n"687" {\n"688" Obj = new Object();\n"689" Obj.Count = 0;\n"690" Obj.Name = Name;\n"691" Obj.Time = 0;\n"692" ProfileData[Name] = Obj;\n"693" }\n"694" Obj.Time += Delta;\n"695" Obj.Count += 1;\n"696" }\n"697"}\n"698"\n"699"function ProfilePlot(s)\n"700"{\n"701" if(ProfileMode)\n"702" {\n"703" var A = ProfileData.Plot;\n"704" if(!A)\n"705" {\n"706" ProfileData.Plot = Array();\n"707" A = ProfileData.Plot;\n"708" }\n"709" if(A.length<10)\n"710" {\n"711" A.push(s);\n"712" }\n"713" }\n"714"}\n"715"function ProfileModeDump()\n"716"{\n"717" for(var idx in ProfileData)\n"718" {\n"719" var Timer = ProfileData[idx];\n"720" console.log(Timer.Name + \" \" + Timer.Time + \"ms \" + Timer.Count);\n"721" }\n"722"}\n"723"\n"724"function ProfileDrawFrameTimeGraph(context)\n"725"{\n"726" if(ProfileMode)\n"727" {\n"728" let Params = CreateDrawGraphParameters();\n"729" let Mouse = {};\n"730" Mouse.X = DetailedViewMouseX;\n"731" Mouse.Y = DetailedViewMouseY;\n"732" Params.RangeMin = 0;\n"733" Params.RangeMax = 50;\n"734"\n"735" let DrawTimeData = CreateGraphData(ProfileDrawTime, \"DrawTime\", \"#ff2288\");\n"736" let DeltaTimeData = CreateGraphData(ProfileDeltaTime, \"DeltaTime\", \"#2288ee\");\n"737" let Draw2DrawData = CreateGraphData(ProfileDraw2Draw, \"Draw2Draw\", \"#11aa33\");\n"738"\n"739" {\n"740" Params.Rect = WindowRect(0, nHeight-200, 200, 200);\n"741"\n"742" DrawGraph(context, Params, [DrawTimeData], Mouse);\n"743" }\n"744" {\n"745" Params.Rect = WindowRect(200, nHeight-200, 200, 200);\n"746"\n"747" DrawGraph(context, Params, [DeltaTimeData], Mouse);\n"748" }\n"749" {\n"750" Params.Rect = WindowRect(400, nHeight-200, 200, 200);\n"751" DrawGraph(context, Params, [Draw2DrawData], Mouse);\n"752" }\n"753" {\n"754" Params.Rect = WindowRect(610, nHeight-200, 200, 200);\n"755" DrawGraph(context, Params, [DrawTimeData, DeltaTimeData,Draw2DrawData], Mouse);\n"756" }\n"757" }\n"758"}\n"759"\n"760"function ProfileModeDraw(Canvas)\n"761"{\n"762" if(ProfileMode)\n"763" {\n"764" var StringArray = [];\n"765" for(var idx in ProfileData)\n"766" {\n"767" if(idx == \"Plot\")\n"768" continue;\n"769" var Timer = ProfileData[idx];\n"770" StringArray.push(Timer.Name);\n"771" StringArray.push(Timer.Time + \"ms\");\n"772" StringArray.push(\"#\");\n"773" StringArray.push(\"\" + Timer.Count);\n"774" }\n"775" StringArray.push(\"debug\");\n"776" StringArray.push(Debug);\n"777" var Time = new Date();\n"778" var Delta = Time - ProfileLastTimeStamp;\n"779" ProfileLastTimeStamp = Time;\n"780" StringArray.push(\"Frame Delta\");\n"781" StringArray.push(Delta + \"ms\");\n"782" if(ProfileMode == 2)\n"783" {\n"784" ProfileFpsAggr += Delta;\n"785" ProfileFpsCount ++ ;\n"786" var AggrFrames = 10;\n"787" if(ProfileFpsCount == AggrFrames)\n"788" {\n"789" ProfileFps = 1000 / (ProfileFpsAggr / AggrFrames);\n"790" ProfileFpsAggr = 0;\n"791" ProfileFpsCount = 0;\n"792" }\n"793" StringArray.push(\"FPS\");\n"794" StringArray.push(\"\" + ProfileFps.toFixed(2));\n"795" }\n"796" StringArray.push(\"ProfileRedraw0\");\n"797" StringArray.push(\"\" + ProfileRedraw0);\n"798" StringArray.push(\"ProfileRedraw1\");\n"799" StringArray.push(\"\" + ProfileRedraw1);\n"800" StringArray.push(\"ProfileRedraw2\");\n"801" StringArray.push(\"\" + ProfileRedraw2);\n"802" ProfileRedraw0 = 0;\n"803" ProfileRedraw1 = 0;\n"804" ProfileRedraw2 = 0;\n"805"\n"806"\n"807" for(var i = 0; i < ProfileData.Plot; ++i)\n"808" {\n"809" StringArray.push(\"\");\n"810" StringArray.push(ProfileData.Plot[i]);\n"811" }\n"812" ProfileData.Plot = Array();\n"813" DrawToolTip(StringArray, Canvas, 0, 200);\n"814" }\n"815"}\n"816"\n"817"function ToggleDebugMode()\n"818"{\n"819" ProfileMode = (ProfileMode+1)%4;\n"820" console.log(\'Toggle Debug Mode \' + ProfileMode);\n"821"}\n"822"\n"823"function DetailedTotal(S)\n"824"{\n"825" var Total = 0;\n"826" for(var i = 0; i < S.Frames.length; i++)\n"827" {\n"828" var frfr = S.Frames[i];\n"829" Total += frfr.frameend - frfr.framestart;\n"830" }\n"831" return Total;\n"832"}\n"833"\n"834"\n"835"function InitFrameInfo()\n"836"{\n"837"\n"838" var div = document.getElementById(\'divFrameInfo\');\n"839" var txt = \'\';\n"840" txt = txt + \'Timers View\' + \'<br>\';\n"841" txt = txt + \'Frames:\' + S.AggregateInfo.Frames +\'<br>\';\n"842" txt = txt + \'Time:\' + S.AggregateInfo.Time.toFixed(2) +\'ms<br>\';\n"843" txt = txt + \'<hr>\';\n"844" txt = txt + \'Detailed View\' + \'<br>\';\n"845" txt = txt + \'Frames:\' + S.Frames.length +\'<br>\';\n"846" txt = txt + \'Time:\' + DetailedTotal(S).toFixed(2) +\'ms<br>\';\n"847" div.innerHTML = txt;\n"848"}\n"849"function InitGroups()\n"850"{\n"851" for(groupid in S.GroupInfo)\n"852" {\n"853" var TimerArray = Array();\n"854" for(timerid in S.TimerInfo)\n"855" {\n"856" if(S.TimerInfo[timerid].group == groupid)\n"857" {\n"858" TimerArray.push(timerid);\n"859" }\n"860" }\n"861" S.GroupInfo[groupid].TimerArray = TimerArray;\n"862" }\n"863"}\n"864"\n"865"\n"866"function ThreadOrderMove(Name, Dir, Top)\n"867"{\n"868" let idx = ThreadOrderNames.indexOf(Name);\n"869" let base = idx;\n"870" idx += Dir;\n"871" let found = -1;\n"872" while(idx >= 0 && idx <= ThreadOrderNames.length)\n"873" {\n"874" let n = S.ThreadNames.indexOf(ThreadOrderNames[idx]);\n"875" if(n != -1)\n"876" {\n"877" found = idx;\n"878" if(!Top)\n"879" break;\n"880" }\n"881" idx += Dir;\n"882" }\n"883" Dir = -Dir;\n"884" while(found >= 0 && found <= ThreadOrderNames.length && (Dir > 0 ? (found <= base) : (found >= base)))\n"885" {\n"886" let Tmp = ThreadOrderNames[found];\n"887" ThreadOrderNames[found] = Name;\n"888" Name = Tmp;\n"889" found += Dir;\n"890" }\n"891" ThreadOrderSort();\n"892"}\n"893"function ThreadOrderMoveUp(Name, Top)\n"894"{\n"895" ThreadOrderMove(Name, -1, Top);\n"896" WriteCookie();\n"897"}\n"898"function ThreadOrderMoveDown(Name, Top)\n"899"{\n"900" ThreadOrderMove(Name, 1, Top);\n"901" WriteCookie();\n"902"}\n"903"function ThreadOrderSort()\n"904"{\n"905" for(let i = 0; i < S.ThreadNames.length; ++i)\n"906" {\n"907" var name = S.ThreadNames[i];\n"908" var idx = ThreadOrderNames.indexOf(name);\n"909" if(idx == -1)\n"910" {\n"911" ThreadOrderNames.push(name);\n"912" }\n"913" }\n"914"\n"915" //clear all that are not present??\n"916" let ThreadOrderX = Array(S.ThreadNames.length);\n"917" for(let i = 0; i < S.ThreadNames.length; ++i)\n"918" {\n"919" let isgpu = S.ISGPU[i]?1:0;\n"920" var n = ThreadOrderNames.indexOf(S.ThreadNames[i]);\n"921" if(n == -1)\n"922" {\n"923" debugger;\n"924" }\n"925" ThreadOrderX[i] = {\"i\":i, \"n\": n, \"g\":isgpu};\n"926" }\n"927" ThreadOrderX.sort(function(l,r){if(l.g!=r.g)return r.g-l.g;return l.n-r.n;}); //sort gpu first\n"928" ThreadOrderT = Array(S.ThreadNames.length);\n"929" for(let i = 0; i < S.ThreadNames.length; ++i)\n"930" {\n"931" ThreadOrderT[i] = ThreadOrderX[i].i;\n"932" }\n"933"}\n"934"function IsThreadActive(ThreadName)\n"935"{\n"936" return !ThreadsHidden[ThreadName];\n"937"}\n"938"\n"939"function ToggleThread(ThreadName, All, FilterArray, State)\n"940"{\n"941" if(ThreadName)\n"942" {\n"943" if(ThreadsHidden[ThreadName])\n"944" {\n"945" delete ThreadsHidden[ThreadName];\n"946" }\n"947" else\n"948" {\n"949" ThreadsHidden[ThreadName] = 1;\n"950" }\n"951" }\n"952" else\n"953" {\n"954" let Names = All ? S.ThreadNames : FilterArray;\n"955"\n"956" for(let i in Names)\n"957" {\n"958" switch(State)\n"959" {\n"960" case 0: if(!ThreadsHidden[Names[i]]){ ThreadsHidden[Names[i]] = 1;} break;\n"961" case 1: ThreadsHidden[Names[i]] = ThreadsHidden[Names[i]] ? 0 : 1; break;\n"962" case 2: if(ThreadsHidden[Names[i]]){ delete ThreadsHidden[Names[i]];} break;\n"963" }\n"964" }\n"965" }\n"966" RequestRedraw();\n"967" Invalidate = 0;\n"968" FilterSearchReset();\n"969" WriteCookie();\n"970"}\n"971"\n"972"\n"973"function CreateOrderArray(Source, NameFunc)\n"974"{\n"975" var Temp = Array(Source.length);\n"976" for(var i = 0; i < Source.length; ++i)\n"977" {\n"978" Temp[i] = {};\n"979" Temp[i].index = i;\n"980" Temp[i].namezz = NameFunc(Source[i]).toLowerCase();\n"981" }\n"982" Temp.sort(function(l, r)\n"983" {\n"984" if(r.namezz<l.namezz)\n"985" {return 1;}\n"986" if(l.namezz<r.namezz)\n"987" {return -1;}\n"988" return 0;\n"989" } );\n"990" var OrderArray = Array(Source.length);\n"991" for(var i = 0; i < Source.length; ++i)\n"992" {\n"993" OrderArray[i] = Temp[i].index;\n"994" }\n"995" return OrderArray;\n"996"}\n"997"\n"998"function InitOrderArrays()\n"999"{\n"1000" ThreadOrder = [];\n"1001" ThreadOrder = CreateOrderArray(S.ThreadNames, function(a){return a;});\n"1002"\n"1003"\n"1004" let MaxLen = 7;\n"1005" let MenuArray = Array();\n"1006" for(let i = 0; i < S.GroupInfo.length; ++i)\n"1007" {\n"1008" let x = {};\n"1009" x.IsCategory = 0;\n"1010" x.category = S.GroupInfo[i].category;\n"1011" x.name = S.GroupInfo[i].name;\n"1012" x.index = i;\n"1013" MenuArray.push(x);\n"1014" }\n"1015" for(let i = 0; i < S.CategoryInfo.length; ++i)\n"1016" {\n"1017" let x = {};\n"1018" x.IsCategory = 1;\n"1019" x.category = i;\n"1020" x.name = S.CategoryInfo[i];\n"1021" x.index = i;\n"1022" MenuArray.push(x);\n"1023" }\n"1024" let OrderFunction = function(a){ return a.category + \"__\" + a.name; };\n"1025" let OrderFunctionMenu = function(a){ return a.IsCategory ? (a.category + \'\') : (a.category + \"__\" + a.name); };\n"1026" GroupOrder = CreateOrderArray(S.GroupInfo, OrderFunction);\n"1027"}\n"1028"\n"1029"function CategoryIndex(CategoryName)\n"1030"{\n"1031" for(var i = 0; i < S.CategoryInfo.length; ++i)\n"1032" {\n"1033" if(S.CategoryInfo[i] == CategoryName)\n"1034" {\n"1035" return i;\n"1036" }\n"1037" }\n"1038" return -1;\n"1039"}\n"1040"function IsCategoryActive(CategoryIdx)\n"1041"{\n"1042" for(var i = 0; i < S.GroupInfo.length; ++i)\n"1043" {\n"1044" if(S.GroupInfo[i].category == CategoryIdx)\n"1045" {\n"1046" var Name = S.GroupInfo[i].name;\n"1047" if(!GroupsActive[Name])\n"1048" {\n"1049" return false;\n"1050" }\n"1051" }\n"1052" }\n"1053" return true;\n"1054"\n"1055"}\n"1056"function ToggleCategory(CategoryName, WantRedraw)\n"1057"{\n"1058" var CategoryIdx = CategoryIndex(CategoryName);\n"1059" if(CategoryIdx < 0)\n"1060" return;\n"1061" var CategoryActive = IsCategoryActive(CategoryIdx);\n"1062" for(var i = 0; i < S.GroupInfo.length; ++i)\n"1063" {\n"1064" if(S.GroupInfo[i].category == CategoryIdx)\n"1065" {\n"1066" var Name = S.GroupInfo[i].name;\n"1067" if(CategoryActive)\n"1068" {\n"1069" delete GroupsDisabled[Name];\n"1070" }\n"1071" else\n"1072" {\n"1073" GroupsDisabled[Name] = 1;\n"1074" }\n"1075" }\n"1076" }\n"1077" WriteCookie();\n"1078" if(WantRedraw)\n"1079" {\n"1080" RequestRedraw();\n"1081" }\n"1082"}\n"1083"\n"1084"function ToggleGroup(GroupName, All, FilterArray, State)\n"1085"{\n"1086" if(GroupName)\n"1087" {\n"1088" if(GroupsDisabled[GroupName])\n"1089" {\n"1090" delete GroupsDisabled[GroupName];\n"1091" }\n"1092" else\n"1093" {\n"1094" GroupsDisabled[GroupName] = 1;\n"1095" }\n"1096" }\n"1097" else\n"1098" {\n"1099" let Names = FilterArray;\n"1100" if(All)\n"1101" {\n"1102" Names = [];\n"1103" for(let i in S.GroupInfo)\n"1104" {\n"1105" Names.push(S.GroupInfo[i].name);\n"1106" }\n"1107" }\n"1108"\n"1109" for(let i in Names)\n"1110" {\n"1111" let N = Names[i];\n"1112" switch(State)\n"1113" {\n"1114" case 2: if(GroupsDisabled[N]){ delete GroupsDisabled[N];} break;\n"1115" case 1:\n"1116" if(GroupsDisabled[N])\n"1117" {\n"1118" delete GroupsDisabled[N];\n"1119" }\n"1120" else\n"1121" {\n"1122" GroupsDisabled[N] = 1;\n"1123" }\n"1124"\n"1125" break;\n"1126" case 0: if(!GroupsDisabled[N]){ GroupsDisabled[N] = 1;} break;\n"1127" }\n"1128" }\n"1129" }\n"1130" WriteCookie();\n"1131"}\n"1132"\n"1133"function UpdateGroupColors()\n"1134"{\n"1135" for(var i = 0; i < S.TimerInfo.length; ++i)\n"1136" {\n"1137" if(GroupColors == 1)\n"1138" {\n"1139" S.TimerInfo[i].cid = S.GroupInfo[S.TimerInfo[i].group].cid;\n"1140" }\n"1141" else\n"1142" {\n"1143" S.TimerInfo[i].cid = S.TimerInfo[i].timercid;\n"1144" }\n"1145" }\n"1146"}\n"1147"function ToggleDetailedFlameMode(WantRedraw)\n"1148"{\n"1149" DrawDetailedFlameMode = (DrawDetailedFlameMode+1)%3;\n"1150" WriteCookie();\n"1151" if(WantRedraw)\n"1152" {\n"1153" RequestRedraw();\n"1154" }\n"1155"}\n"1156"\n"1157"function ToggleDetailedNewDraw()\n"1158"{\n"1159" DrawDetailedNewDraw = DrawDetailedNewDraw ? 0 : 1;\n"1160" WriteCookie();\n"1161" RequestRedraw();\n"1162"}\n"1163"\n"1164"\n"1165"\n"1166"function ToggleDetailedSecondReverse(WantRedraw)\n"1167"{\n"1168" DrawDetailedCompareReverse = 1-DrawDetailedCompareReverse;\n"1169" WriteCookie();\n"1170" if(WantRedraw)\n"1171" {\n"1172" RequestRedraw();\n"1173" }\n"1174"}\n"1175"\n"1176"function ToggleGroupColors(WantRedraw)\n"1177"{\n"1178" GroupColors = (GroupColors+1)%4;\n"1179" UpdateGroupColors();\n"1180" WriteCookie();\n"1181" if(WantRedraw)\n"1182" {\n"1183" RequestRedraw();\n"1184" }\n"1185"}\n"1186"\n"1187"function ShowHelp(Show, Forever)\n"1188"{\n"1189" var HelpWindow = document.getElementById(\'helpwindow\');\n"1190" if(Show)\n"1191" {\n"1192" HelpWindow.style[\'display\'] = \'block\';\n"1193" }\n"1194" else\n"1195" {\n"1196" HelpWindow.style[\'display\'] = \'none\';\n"1197" }\n"1198" if(Forever)\n"1199" {\n"1200" nHideHelp = Show ? 0 : 1;\n"1201" WriteCookie();\n"1202" }\n"1203"}\n"1204"function ToggleMode()\n"1205"{\n"1206" Mode = (Mode + 1) % ModeCount;\n"1207" SetMode(Mode);\n"1208"}\n"1209"\n"1210"function SetMode(NewMode, WantRedraw)\n"1211"{\n"1212" ResetColumnWidth();\n"1213" Mode = NewMode;\n"1214" if(Mode == ModeTimers || Mode == ModeTimers_Groups || Mode == ModeTimers_Threads)\n"1215" {\n"1216" SetFilterInput(FilterInputGroupString, FilterInputTimerString);\n"1217" }\n"1218" else\n"1219" {\n"1220" ShowFilterInput(0);\n"1221" }\n"1222" ShowDetailedSearch(false);\n"1223"\n"1224" WriteCookie();\n"1225" if(WantRedraw)\n"1226" {\n"1227" RequestRedraw();\n"1228" }\n"1229"}\n"1230"\n"1231"\n"1232"function UpdateReferenceTime()\n"1233"{\n"1234" S.CaptureStartTime = S.Frames[0].framestart;\n"1235" S.CaptureEndTime = S.Frames[S.Frames.length-1].frameend;\n"1236"\n"1237" if(\'auto\' == ReferenceTimeString.substring(0,4))\n"1238" {\n"1239" let Max = 0.1;\n"1240" for(var i = 0; i < S.Frames.length; ++i)\n"1241" {\n"1242" let T = S.Frames[i].frameend - S.Frames[i].framestart;\n"1243" Max = Math.max(T, Max);\n"1244" }\n"1245" ReferenceTime = Max*1.20;\n"1246" if(TargetTime>0)\n"1247" {\n"1248" ReferenceTime = Math.max(ReferenceTime, TargetTime * 1.33);\n"1249" }\n"1250" ReferenceTimeAutoString = \'auto [\' + Max.toFixed(2) + \'ms]\';\n"1251" }\n"1252" else\n"1253" {\n"1254" ReferenceTime = parseInt(ReferenceTimeString);\n"1255" }\n"1256"}\n"1257"\n"1258"function SetReferenceTime(TimeString, WantRedraw)\n"1259"{\n"1260" ReferenceTimeString = TimeString;\n"1261" UpdateReferenceTime();\n"1262" WriteCookie();\n"1263" if(WantRedraw)\n"1264" {\n"1265" RequestRedraw();\n"1266" }\n"1267"}\n"1268"\n"1269"function SetTargetTime(TimeString, WantRedraw)\n"1270"{\n"1271" TargetTimeString = TimeString;\n"1272" TargetTime = parseInt(TargetTimeString);\n"1273" WriteCookie();\n"1274" if(WantRedraw)\n"1275" {\n"1276" RequestRedraw();\n"1277" }\n"1278"}\n"1279"\n"1280"function ToggleContextSwitch()\n"1281"{\n"1282" SetContextSwitch(nContextSwitchEnabled ? 0 : 1);\n"1283"}\n"1284"\n"1285"function SetContextSwitch(Enabled, WantRedraw)\n"1286"{\n"1287" nContextSwitchEnabled = Enabled ? 1 : 0;\n"1288" WriteCookie();\n"1289" if(WantRedraw)\n"1290" {\n"1291" RequestRedraw();\n"1292" }\n"1293"}\n"1294"function PushIntoArray(A, v)\n"1295"{\n"1296" A.shift();\n"1297" A.push(v);\n"1298"}\n"1299"function ToggleDebug()\n"1300"{\n"1301" Debug = (Debug + 1) % 2;\n"1302"}\n"1303"\n"1304"function ToggleDisableMerge()\n"1305"{\n"1306" DisableMerge = DisableMerge ? 0 : 1;\n"1307"}\n"1308"function ToggleDisableLod()\n"1309"{\n"1310" DisableLod = DisableLod ? 0 : 1;\n"1311"}\n"1312"\n"1313"function GatherHoverMetaCounters(TimerIndex, StartIndex, nLog, nFrameLast)\n"1314"{\n"1315" var HoverInfo = new Object();\n"1316" return HoverInfo;\n"1317" var StackPos = 1;\n"1318" //search backwards, count meta counters\n"1319" for(var i = nFrameLast; i >= 0; i--)\n"1320" {\n"1321" var fr = S.Frames[i];\n"1322" var ts = fr.ts[nLog];\n"1323" var ti = fr.ti[nLog];\n"1324" var tt = fr.tt[nLog];\n"1325" var start = i == nFrameLast ? StartIndex-1-fr.LogStart[nLog] : ts.length-1;\n"1326"\n"1327" for(var j = start; j >= 0; j--)\n"1328" {\n"1329" var type = tt[j];\n"1330" var index = ti[j];\n"1331" var time = ts[j];\n"1332" if(type == 1)\n"1333" {\n"1334" StackPos--;\n"1335" if(StackPos == 0 && index == TimerIndex)\n"1336" {\n"1337" return HoverInfo;\n"1338" }\n"1339" }\n"1340" else if(type == 0)\n"1341" {\n"1342" StackPos++;\n"1343" }\n"1344" else if(type > 1)\n"1345" {\n"1346" // var nMetaCount = type - 3;\n"1347" // var nMetaIndex = MetaNames[index];\n"1348" // if(nMetaIndex in HoverInfo)\n"1349" // {\n"1350" // HoverInfo[nMetaIndex] += nMetaCount;\n"1351" // }\n"1352" // else\n"1353" // {\n"1354" // HoverInfo[nMetaIndex] = nMetaCount;\n"1355" // }\n"1356" }\n"1357" }\n"1358" }\n"1359"}\n"1360"function CalculateAllTimers(fBegin, fEnd)\n"1361"{\n"1362" var Sum = [];\n"1363" var Count = [];\n"1364" var Sorted = [];\n"1365" for(var i = 0; i < S.TimerInfo.length; ++i)\n"1366" {\n"1367" Sum.push(0.0);\n"1368" Count.push(0);\n"1369" Sorted.push(i);\n"1370" }\n"1371" var nFrameFirst = 0;\n"1372" var nFrameLast = S.Frames.length;\n"1373"\n"1374" var nNumLogs = S.Frames[0].ts.length;\n"1375" var StackPosArray = Array(nNumLogs);\n"1376" var StackArray = Array(nNumLogs);\n"1377" for(var i = 0; i < nNumLogs; ++i)\n"1378" {\n"1379" StackPosArray[i] = 0;\n"1380" StackArray[i] = Array(20);\n"1381" }\n"1382"\n"1383" for(var i = nFrameFirst; i < nFrameLast; i++)\n"1384" {\n"1385" var fr = S.Frames[i];\n"1386" for(nLog = 0; nLog < nNumLogs; nLog++)\n"1387" {\n"1388" var StackPos = StackPosArray[nLog];\n"1389" var Stack = StackArray[nLog];\n"1390" var ts = fr.ts[nLog];\n"1391" var ti = fr.ti[nLog];\n"1392" var tt = fr.tt[nLog];\n"1393" var count = ts.length;\n"1394" for(j = 0; j < count; j++)\n"1395" {\n"1396" var type = tt[j];\n"1397" var index = ti[j];\n"1398" var time = ts[j];\n"1399" if(type == 1 && time < fEnd) //enter\n"1400" {\n"1401" Stack[StackPos] = time < fBegin ? fBegin : time;\n"1402" if(StackArray[nLog][StackPos] != time)\n"1403" {\n"1404" console.log(\'fail fail fail\');\n"1405" }\n"1406" StackPos++;\n"1407" }\n"1408" else if(type == 0) // leave\n"1409" {\n"1410" if(StackPos>0)\n"1411" {\n"1412" var timeend = time;\n"1413" StackPos--;\n"1414" timestart = Stack[StackPos];\n"1415" var TimeDelta = timeend - timestart;\n"1416" Sum[index] += TimeDelta;\n"1417" Count[index]++;\n"1418" }\n"1419" }\n"1420" }\n"1421" StackPosArray[nLog] = StackPos;\n"1422" }\n"1423" }\n"1424" Sorted.sort(function(a,b){ return Sum[b] - Sum[a]; } );\n"1425" var Result = {\"Sorted\" : Sorted, \"Sum\" : Sum, \"Count\" : Count};\n"1426" return Result;\n"1427"}\n"1428"\n"1429"function CalculateTimers2(Result, TimerIndex, Time, SContext)\n"1430"{\n"1431" let nFrame = -1;\n"1432" for(var i = 0; i < SContext.Frames.length; ++i)\n"1433" {\n"1434" let F = SContext.Frames[i];\n"1435" if(Time > F.framestart && Time <= F.frameend)\n"1436" {\n"1437" nFrame = i;\n"1438" break;\n"1439" }\n"1440" }\n"1441" CalculateTimers(Result, TimerIndex, nFrame, nFrame+1, SContext);\n"1442" return nFrame;\n"1443"}\n"1444"\n"1445"function CalculateTimers(Result, TimerIndex, nFrameFirst, nFrameLast, SContext)\n"1446"{\n"1447" if(!SContext)\n"1448" SContext = S;\n"1449" if(!nFrameFirst || nFrameFirst < 0)\n"1450" nFrameFirst = 0;\n"1451" if(!nFrameLast || nFrameLast > SContext.Frames.length)\n"1452" nFrameLast = SContext.Frames.length;\n"1453" var FrameCount = nFrameLast - nFrameFirst;\n"1454" if(0 == FrameCount)\n"1455" return;\n"1456" var CallCount = 0;\n"1457" var Sum = 0;\n"1458" var Max = 0;\n"1459" var FrameMax = 0;\n"1460"\n"1461" var nNumLogs = SContext.Frames[0].ts.length;\n"1462" var StackPosArray = Array(nNumLogs);\n"1463" var StackArray = Array(nNumLogs);\n"1464" let StackIndexArray = Array(nNumLogs);\n"1465" for(var i = 0; i < nNumLogs; ++i)\n"1466" {\n"1467" StackPosArray[i] = 0;\n"1468" StackArray[i] = Array(32);\n"1469" StackIndexArray[i] = Array(32);\n"1470" }\n"1471"\n"1472" for(var i = nFrameFirst; i < nFrameLast; i++)\n"1473" {\n"1474" let FrameSum = 0;\n"1475" let fr = SContext.Frames[i];\n"1476" for(nLog = 0; nLog < nNumLogs; nLog++)\n"1477" {\n"1478" let StackPos = StackPosArray[nLog];\n"1479" let Stack = StackArray[nLog];\n"1480" let StackIndex = StackIndexArray[nLog];\n"1481" var ts = fr.ts[nLog];\n"1482" var ti = fr.ti[nLog];\n"1483" var tt = fr.tt[nLog];\n"1484" var count = ts.length;\n"1485" for(var j = 0; j < count; j++)\n"1486" {\n"1487" var type = tt[j];\n"1488" var index = ti[j];\n"1489" var time = ts[j];\n"1490" if(index < ETOKEN_MAX)\n"1491" {\n"1492" if(type == 1) //enter\n"1493" {\n"1494" //push\n"1495" Stack[StackPos] = time;\n"1496" StackIndex[StackPos] = index;\n"1497" if(StackArray[nLog][StackPos] != time)\n"1498" {\n"1499" console.log(\'fail fail fail\');\n"1500" }\n"1501" StackPos++;\n"1502" }\n"1503" else if(type == 0) // leave\n"1504" {\n"1505" var timestart;\n"1506" var timeend = time;\n"1507" if(StackPos>0)\n"1508" {\n"1509" StackPos--;\n"1510" timestart = Stack[StackPos];\n"1511" }\n"1512" else\n"1513" {\n"1514" timestart = SContext.Frames[nFrameFirst].framestart;\n"1515" }\n"1516" if(index == TimerIndex)\n"1517" {\n"1518" let TimeDelta = timeend - timestart;\n"1519" CallCount++;\n"1520" FrameSum += TimeDelta;\n"1521" Sum += TimeDelta;\n"1522" if(TimeDelta > Max)\n"1523" Max = TimeDelta;\n"1524" }\n"1525" }\n"1526" else\n"1527" {\n"1528" //meta\n"1529" }\n"1530" }\n"1531" }\n"1532" if(i == nFrameLast - 1)\n"1533" {\n"1534" for(var j = 0; j < StackPos; ++j)\n"1535" {\n"1536" if(StackIndex[j] == TimerIndex)\n"1537" {\n"1538" let LastFrameEnd = SContext.Frames[nFrameLast-1].frameend;\n"1539" let TimeDelta = LastFrameEnd - Stack[j];\n"1540" CallCount++;\n"1541" FrameSum += TimeDelta;\n"1542" Sum += TimeDelta;\n"1543" if(TimeDelta > Max)\n"1544" Max = TimeDelta;\n"1545" break;\n"1546" }\n"1547" }\n"1548"\n"1549" }\n"1550" if(FrameSum > FrameMax)\n"1551" {\n"1552" FrameMax = FrameSum;\n"1553" }\n"1554" StackPosArray[nLog] = StackPos;\n"1555" }\n"1556" }\n"1557"\n"1558" Result.CallCount = CallCount;\n"1559" Result.Sum = Sum.toFixed(3);\n"1560" Result.Max = Max.toFixed(3);\n"1561" Result.Average = (Sum / CallCount).toFixed(3);\n"1562" Result.FrameAverage = (Sum / FrameCount).toFixed(3);\n"1563" Result.FrameCallAverage = (CallCount / FrameCount).toFixed(3);\n"1564" Result.FrameMax = FrameMax.toFixed(3);\n"1565" return Result;\n"1566"}\n"1567"\n"1568"function PreprocessCalculateAllTimers()\n"1569"{\n"1570" ProfileEnter(\"CalculateAllTimers\");\n"1571" let nFrameFirst = 0;\n"1572" let nFrameLast = S.Frames.length;\n"1573" let FrameCount = nFrameLast - nFrameFirst;\n"1574" if(0 == FrameCount)\n"1575" return;\n"1576" for(let j = 0; j < S.TimerInfo.length; j++)\n"1577" {\n"1578" S.TimerInfo[j].CallCount = 0;\n"1579" S.TimerInfo[j].CallCountExcl = 0;\n"1580" S.TimerInfo[j].Sum = 0;\n"1581" S.TimerInfo[j].SumExcl = 0;\n"1582" S.TimerInfo[j].Max = 0;\n"1583" S.TimerInfo[j].MaxExcl = 0;\n"1584" S.TimerInfo[j].Average = 0;\n"1585" S.TimerInfo[j].AverageExcl = 0;\n"1586" S.TimerInfo[j].FrameAverage = 0;\n"1587" S.TimerInfo[j].FrameAverageExcl = 0;\n"1588" S.TimerInfo[j].FrameCallAverage = 0;\n"1589" S.TimerInfo[j].FrameMax = 0;\n"1590" S.TimerInfo[j].FrameMaxExcl = 0;\n"1591" }\n"1592"\n"1593"\n"1594" let nNumLogs = S.Frames[0].ts.length;\n"1595" let ChildTimeStackArray = new Array(nNumLogs);\n"1596" let TimerStackArray = new Array(nNumLogs);\n"1597" let StackPosArray = Array(nNumLogs);\n"1598" let StackArray = Array(nNumLogs);\n"1599" function ClearArray(a)\n"1600" {\n"1601" for(let j = 0; j < a.length; ++j)\n"1602" a[j] = 0;\n"1603" }\n"1604" for(let i = 0; i < nNumLogs; ++i)\n"1605" {\n"1606" StackPosArray[i] = 0;\n"1607" StackArray[i] = Array(20);\n"1608" ChildTimeStackArray[i] = Array(32);\n"1609" ClearArray(ChildTimeStackArray[i]);\n"1610" TimerStackArray[i] = Array(S.TimerInfo.length);\n"1611" ClearArray(TimerStackArray[i]); \n"1612" }\n"1613"\n"1614" for(let i = nFrameFirst; i < nFrameLast; i++)\n"1615" {\n"1616" for(let j = 0; j < S.TimerInfo.length; j++)\n"1617" {\n"1618" S.TimerInfo[j].FrameSum = 0;\n"1619" S.TimerInfo[j].FrameSumExcl = 0;\n"1620" }\n"1621"\n"1622" let fr = S.Frames[i];\n"1623" for(nLog = 0; nLog < nNumLogs; nLog++)\n"1624" {\n"1625" let StackPos = StackPosArray[nLog];\n"1626" let Stack = StackArray[nLog];\n"1627" let ChildTimeStack = ChildTimeStackArray[nLog];\n"1628" let TimerStack = TimerStackArray[nLog];\n"1629"\n"1630" let ts = fr.ts[nLog];\n"1631" let ti = fr.ti[nLog];\n"1632" let tt = fr.tt[nLog];\n"1633" let count = ts.length;\n"1634" for(j = 0; j < count; j++)\n"1635" {\n"1636" let type = tt[j];\n"1637" let index = ti[j];\n"1638" let time = ts[j];\n"1639" if(index < ETOKEN_MAX && index >= 0)\n"1640" {\n"1641" if(type == 1) //enter\n"1642" {\n"1643" //push\n"1644" Stack[StackPos] = time;\n"1645" TimerStack[index] += 1;\n"1646" if(StackArray[nLog][StackPos] != time)\n"1647" {\n"1648" console.log(\'fail fail fail\');\n"1649" }\n"1650" StackPos++;\n"1651" }\n"1652" else if(type == 0) // leave\n"1653" {\n"1654" let TimeStart;\n"1655" let TimeEnd = time;\n"1656" let TimeChild = 0;\n"1657" if(StackPos>0)\n"1658" {\n"1659" StackPos--;\n"1660" TimeStart = Stack[StackPos];\n"1661" TimeChild = ChildTimeStack[StackPos];\n"1662" ChildTimeStack[StackPos] = 0;\n"1663" }\n"1664" else\n"1665" {\n"1666" TimeStart = S.Frames[nFrameFirst].framestart;\n"1667" }\n"1668" let TimerIsRoot = TimerStack[index] == 0 || (0 == --TimerStack[index]);\n"1669" let TimeDelta = TimeEnd - TimeStart;\n"1670" let TimeDeltaExcl = Math.max(0, TimeDelta - TimeChild);\n"1671" S.TimerInfo[index].SumExcl += TimeDeltaExcl;\n"1672" S.TimerInfo[index].FrameSumExcl += TimeDeltaExcl;\n"1673" S.TimerInfo[index].CallCountExcl++;\n"1674" if(TimeDeltaExcl > S.TimerInfo[index].MaxExcl)\n"1675" {\n"1676" S.TimerInfo[index].MaxExcl = TimeDeltaExcl;\n"1677" }\n"1678"\n"1679" if(TimerIsRoot)\n"1680" {\n"1681" S.TimerInfo[index].CallCount++;\n"1682" S.TimerInfo[index].FrameSum += TimeDelta;\n"1683" S.TimerInfo[index].Sum += TimeDelta;\n"1684" if(TimeDelta > S.TimerInfo[index].Max)\n"1685" {\n"1686" S.TimerInfo[index].Max = TimeDelta;\n"1687" S.TimerInfo[index].worst = TimeDelta;\n"1688" S.TimerInfo[index].worststart = TimeStart;\n"1689" S.TimerInfo[index].worstend = TimeEnd;\n"1690" S.TimerInfo[index].worstthread = nLog;\n"1691" }\n"1692" }\n"1693" if(StackPos > 0)\n"1694" ChildTimeStack[StackPos-1] += TimeDelta;\n"1695" }\n"1696" }\n"1697" }\n"1698" for(let j = 0; j < S.TimerInfo.length; j++)\n"1699" {\n"1700" if(S.TimerInfo[j].FrameSum > S.TimerInfo[j].FrameMax)\n"1701" {\n"1702" S.TimerInfo[j].FrameMax = S.TimerInfo[j].FrameSum;\n"1703" }\n"1704" if(S.TimerInfo[j].FrameSumExcl > S.TimerInfo[j].FrameMaxExcl)\n"1705" {\n"1706" S.TimerInfo[j].FrameMaxExcl = S.TimerInfo[j].FrameSumExcl;\n"1707" }\n"1708"\n"1709" }\n"1710" StackPosArray[nLog] = StackPos;\n"1711" }\n"1712"\n"1713"\n"1714" }\n"1715"\n"1716" for(let j = 0; j < S.TimerInfo.length; j++)\n"1717" {\n"1718" let CallCount = S.TimerInfo[j].CallCount;\n"1719" let Sum = S.TimerInfo[j].Sum.toFixed(3);\n"1720" let SumExcl = S.TimerInfo[j].SumExcl.toFixed(3);\n"1721" let Max = S.TimerInfo[j].Max.toFixed(3);\n"1722" let MaxExcl = S.TimerInfo[j].MaxExcl.toFixed(3);\n"1723" let Average = (S.TimerInfo[j].Sum / S.TimerInfo[j].CallCount).toFixed(3);\n"1724" let AverageExcl = (S.TimerInfo[j].SumExcl / S.TimerInfo[j].CallCountExcl).toFixed(3);\n"1725" let FrameAverage = (S.TimerInfo[j].Sum / FrameCount).toFixed(3);\n"1726" let FrameAverageExcl = (S.TimerInfo[j].SumExcl / FrameCount).toFixed(3);\n"1727" let FrameCallAverage = (S.TimerInfo[j].CallCount / FrameCount).toFixed(3);\n"1728" let FrameMax = S.TimerInfo[j].FrameMax.toFixed(3);\n"1729" let FrameMaxExcl = S.TimerInfo[j].FrameMaxExcl.toFixed(3);\n"1730"\n"1731" S.TimerInfo[j].CallCount = CallCount;\n"1732" S.TimerInfo[j].Sum = Sum;\n"1733" S.TimerInfo[j].SumExcl = SumExcl;\n"1734" S.TimerInfo[j].Max = Max;\n"1735" S.TimerInfo[j].MaxExcl = MaxExcl;\n"1736" S.TimerInfo[j].Average = Average;\n"1737" S.TimerInfo[j].AverageExcl = AverageExcl;\n"1738" S.TimerInfo[j].FrameAverage = FrameAverage;\n"1739" S.TimerInfo[j].FrameAverageExcl = FrameAverageExcl;\n"1740" S.TimerInfo[j].FrameCallAverage = FrameCallAverage;\n"1741" S.TimerInfo[j].FrameMax = FrameMax;\n"1742" S.TimerInfo[j].FrameMaxExcl = FrameMaxExcl; \n"1743" }\n"1744" ProfileLeave();\n"1745"}\n"1746"\n"1747"var FlashFrames = 10;\n"1748"var FlashFrameCounter = 0;\n"1749"var FlashMessage = \'\';\n"1750"function TimeString(Diff)\n"1751"{\n"1752" var DiffString = \"0 sec\";\n"1753" var DiffTable = [1,60,60*60,60*60*24];\n"1754" var DiffNameTable = [\"sec\", \"min\", \"hr\", \"day\"];\n"1755" for(var i = 0; i < DiffTable.length; ++i)\n"1756" {\n"1757" if(Diff >= DiffTable[i])\n"1758" {\n"1759" DiffString = Math.floor(Diff / DiffTable[i]) + \" \" + DiffNameTable[i];\n"1760" }\n"1761" }\n"1762" return DiffString;\n"1763"\n"1764"}\n"1765"function ShowFlashMessage(Message, FrameCount)\n"1766"{\n"1767" FlashMessage = Message;\n"1768" FlashFrameCounter = FrameCount;\n"1769"}\n"1770"function OnPageReady()\n"1771"{\n"1772" var DumpDate = S.DumpUtcCaptureTime;\n"1773" var CurrentDate = Date.now() / 1000;\n"1774" var Diff = CurrentDate - DumpDate;\n"1775" var Limit = 10*60;//flash old message when loading captures older than 10 minutes\n"1776" if(Diff > Limit)\n"1777" {\n"1778" ShowFlashMessage(\"Captured \" + TimeString(Diff) + \" ago\", 100);\n"1779" }\n"1780"}\n"1781"\n"1782"function DrawFlash";17831784const size_t g_MicroProfileHtml_end_0_size = sizeof(g_MicroProfileHtml_end_0);1785const char g_MicroProfileHtml_end_1[] =1786"Message(context)\n"1787"{\n"1788" if(FlashFrameCounter > 0)\n"1789" {\n"1790" if(FlashFrameCounter>1)\n"1791" {\n"1792" var FlashPrc = Math.sin(FlashFrameCounter / FlashFrames);\n"1793" context.font = FontFlash;\n"1794" context.globalAlpha = FlashPrc * 0.35 + 0.5;\n"1795" context.textAlign = \'center\';\n"1796" context.fillStyle = \'red\';\n"1797" context.fillText(FlashMessage, nWidth * 0.5, 50);\n"1798" context.globalAlpha = 1;\n"1799" context.textAlign = \'left\';\n"1800" context.font = Font;\n"1801" }\n"1802" FlashFrameCounter -= 1;\n"1803"\n"1804" }\n"1805"}\n"1806"\n"1807"function DrawCaptureInfo(context)\n"1808"{\n"1809" context.fillStyle = \'white\';\n"1810" context.textAlign = \'right\';\n"1811" context.font = Font;\n"1812" var DumpDate = S.DumpUtcCaptureTime;\n"1813" var CurrentDate = Date.now() / 1000;\n"1814" var Diff = CurrentDate - DumpDate;\n"1815" var DiffString = TimeString(Diff) + \" ago\";\n"1816" context.fillText(new Date(DumpDate*1000).toLocaleString(), nWidth, FontHeight);\n"1817" if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"1818" {\n"1819" context.fillText(\"Timer Frames: \" + S.AggregateInfo.Frames, nWidth, FontHeight*2);\n"1820" }\n"1821" else\n"1822" {\n"1823" context.fillText(\"Detailed Frames \"+ S.Frames.length, nWidth, FontHeight*2);\n"1824" }\n"1825" context.fillText(S.DumpHost, nWidth, FontHeight*3);\n"1826" context.fillText(DiffString, nWidth, FontHeight*4);\n"1827" context.textAlign = \'left\';\n"1828" DrawFlashMessage(context);\n"1829"}\n"1830"\n"1831"function DrawDetailedFrameHistory()\n"1832"{\n"1833" ProfileEnter(\"DrawDetailedFrameHistory\");\n"1834" var x = HistoryViewMouseX;\n"1835"\n"1836" var context = CanvasHistory.getContext(\'2d\');\n"1837" context.clearRect(0, 0, CanvasHistory.width, CanvasHistory.height);\n"1838"\n"1839" let HistoryHeight = CanvasHistory.height;\n"1840"\n"1841" var GreenTime = (TargetTime * 0.9);\n"1842" var RedBegin = (TargetTime * 1.1);\n"1843" var LerpDist = 1.0 / (RedBegin - GreenTime);\n"1844"\n"1845"\n"1846" var fHeight = nHistoryHeight;\n"1847" var fWidth = nWidth / S.Frames.length;\n"1848" var fHeightScale = fHeight / ReferenceTime;\n"1849" var fX = 0;\n"1850" var FrameIndex = -1;\n"1851" var MouseDragging = MouseDragState != MouseDragOff;\n"1852" RangeCpuHistory = RangeInit();\n"1853" RangeGpuHistory = RangeInit()\n"1854"\n"1855" var FrameFirst = -1;\n"1856" var FrameLast = nWidth;\n"1857" var fDetailedOffsetEnd = fDetailedOffset + fDetailedRange;\n"1858" for(i = 0; i < S.Frames.length; i++)\n"1859" {\n"1860" var fMs = S.Frames[i].frameend - S.Frames[i].framestart;\n"1861"\n"1862" var fPrc = (fMs - GreenTime) * LerpDist;\n"1863" fPrc = Clamp(fPrc, 0, 1);\n"1864" var color = LerpColor(fPrc);\n"1865"\n"1866"\n"1867"\n"1868" if(fDetailedOffset <= S.Frames[i].frameend && fDetailedOffset >= S.Frames[i].framestart)\n"1869" {\n"1870" var lerp = (fDetailedOffset - S.Frames[i].framestart) / (S.Frames[i].frameend - S.Frames[i].framestart);\n"1871" FrameFirst = fX + fWidth * lerp;\n"1872" }\n"1873" if(fDetailedOffsetEnd <= S.Frames[i].frameend && fDetailedOffsetEnd >= S.Frames[i].framestart)\n"1874" {\n"1875" var lerp = (fDetailedOffsetEnd - S.Frames[i].framestart) / (S.Frames[i].frameend - S.Frames[i].framestart);\n"1876" FrameLast = fX + fWidth * lerp;\n"1877" }\n"1878" var fH = fHeightScale * fMs;\n"1879" var bMouse = x > fX && x < fX + fWidth;\n"1880" if(bMouse && !MouseDragging)\n"1881" {\n"1882" context.fillStyle = FRAME_HISTORY_COLOR_GPU;\n"1883" RangeCpuHistory.Begin = S.Frames[i].framestart;\n"1884" RangeCpuHistory.End = S.Frames[i].frameend;\n"1885" if(S.Frames[i].framestartgpu)\n"1886" {\n"1887" RangeGpuHistory.Begin = S.Frames[i].framestartgpu;\n"1888" RangeGpuHistory.End = S.Frames[i].frameendgpu;\n"1889" }\n"1890" FrameIndex = i;\n"1891" }\n"1892" else\n"1893" {\n"1894" context.fillStyle = color;\n"1895" }\n"1896" context.fillRect(fX, fHeight - fH, fWidth-1, fH);\n"1897" fX += fWidth;\n"1898" }\n"1899"\n"1900" var fRangeHistoryBegin = FrameFirst;\n"1901" var fRangeHistoryEnd = FrameLast;\n"1902" var X = fRangeHistoryBegin;\n"1903" var Y = 0;\n"1904" var W = fRangeHistoryEnd - fRangeHistoryBegin;\n"1905" context.globalAlpha = 0.35;\n"1906" context.fillStyle = \'#009900\';\n"1907" context.fillRect(X, Y, W, fHeight);\n"1908" context.globalAlpha = 1;\n"1909" context.strokeStyle = \'#00ff00\';\n"1910" context.beginPath();\n"1911" context.moveTo(X, Y);\n"1912" context.lineTo(X, Y+fHeight);\n"1913" context.moveTo(X+W, Y);\n"1914" context.lineTo(X+W, Y+fHeight);\n"1915" context.stroke();\n"1916"\n"1917" {\n"1918" var fH = fHeight - fHeightScale * TargetTime;\n"1919" context.fillStyle = \'wheat\';\n"1920" context.strokeStyle = \'wheat\';\n"1921" context.beginPath();\n"1922" context.moveTo(0, fH);\n"1923" context.lineTo(nWidth, fH);\n"1924" // context.closePath();\n"1925" context.stroke();\n"1926" var YText;\n"1927" if(fH > HistoryHeight * 0.25)\n"1928" {\n"1929" YText = fH - FontAscent;\n"1930" }\n"1931" else\n"1932" {\n"1933" YText = fH + FontHeight;\n"1934" }\n"1935" context.fillText(TargetTime + \'ms\', 3, YText);\n"1936" context.textAlign=\'right\';\n"1937" context.fillText(FormatTime(ReferenceTime) + \'ms\', nWidth, FontHeight);\n"1938" context.textAlign=\'left\';\n"1939" }\n"1940"\n"1941"\n"1942" DrawCaptureInfo(context);\n"1943"\n"1944" if(FrameIndex>=0 && !MouseDragging)\n"1945" {\n"1946" var StringArray = [];\n"1947" StringArray.push(\"Frame\");\n"1948" StringArray.push(\"\" + FrameIndex);\n"1949" StringArray.push(\"Time\");\n"1950" StringArray.push(\"\" + (S.Frames[FrameIndex].frameend - S.Frames[FrameIndex].framestart).toFixed(3));\n"1951"\n"1952" DrawToolTip(StringArray, CanvasHistory, HistoryViewMouseX, HistoryViewMouseY+20);\n"1953"\n"1954" }\n"1955" ProfileLeave();\n"1956"}\n"1957"function TimeToMsString(Time)\n"1958"{\n"1959" return Time.toFixed(3) + \"ms\";\n"1960"}\n"1961"function TimeToString(Time)\n"1962"{\n"1963" if(Time > 1000)\n"1964" {\n"1965" return (Time/1000.0).toFixed(0) +\"s\";\n"1966" }\n"1967" else if(Time > 0.9)\n"1968" {\n"1969" return Time.toFixed(0) + \"ms\";\n"1970" }\n"1971" else if(Time > 0.0009)\n"1972" {\n"1973" return (Time*1000).toFixed(0) + \"us\";\n"1974" }\n"1975" else\n"1976" {\n"1977" return (Time*1000000).toFixed(0) + \"ns\";\n"1978" }\n"1979"}\n"1980"\n"1981"function DrawDetailedBackground(context)\n"1982"{\n"1983" var fMs = fDetailedRange;\n"1984" var fMsEnd = fMs + fDetailedOffset;\n"1985" var fMsToScreen = nWidth / fMs;\n"1986" var fRate = Math.floor(2*((Math.log(fMs)/Math.log(10))-1))/2;\n"1987" var fStep = Math.pow(10, fRate);\n"1988" var fRcpStep = 1.0 / fStep;\n"1989" var nColorIndex = Math.floor(fDetailedOffset * fRcpStep) % 2;\n"1990" if(nColorIndex < 0)\n"1991" nColorIndex = -nColorIndex;\n"1992" var fStart = Math.floor(fDetailedOffset * fRcpStep) * fStep;\n"1993" var fHeight = CanvasDetailedView.height;\n"1994" var fScaleX = nWidth / fDetailedRange;\n"1995" var HeaderString = TimeToString(fStep);\n"1996" context.textAlign = \'center\';\n"1997" for(f = fStart; f < fMsEnd; )\n"1998" {\n"1999" var fNext = f + fStep;\n"2000" var X = (f - fDetailedOffset) * fScaleX;\n"2001" var W = (fNext-f)*fScaleX;\n"2002" context.fillStyle = nBackColors[nColorIndex];\n"2003" context.fillRect(X, 0, W+2, fHeight);\n"2004" nColorIndex = 1 - nColorIndex;\n"2005" context.fillStyle = \'#777777\'\n"2006" context.fillText(HeaderString, X + W * 0.5, 10);\n"2007" context.fillText(HeaderString, X + W * 0.5, nHeight - 10);\n"2008" f = fNext;\n"2009" }\n"2010" context.textAlign = \'left\';\n"2011" var fScaleX = nWidth / fDetailedRange;\n"2012" context.globalAlpha = 0.5;\n"2013" context.strokeStyle = \'#bbbbbb\';\n"2014" context.beginPath();\n"2015" for(var i = 0; i < S.Frames.length; i++)\n"2016" {\n"2017" var frfr = S.Frames[i];\n"2018" if(frfr.frameend < fDetailedOffset || frfr.framestart > fDetailedOffset + fDetailedRange)\n"2019" {\n"2020" continue;\n"2021" }\n"2022" var X = (frfr.framestart - fDetailedOffset) * fScaleX;\n"2023" if(X >= 0 && X < nWidth)\n"2024" {\n"2025" context.moveTo(X, 0);\n"2026" context.lineTo(X, nHeight);\n"2027" }\n"2028" }\n"2029" context.stroke();\n"2030" context.globalAlpha = 1;\n"2031"\n"2032"}\n"2033"\n"2034"function DrawToolTip(StringArray, Canvas, x, y, bSecondary)\n"2035"{\n"2036" var context = Canvas.getContext(\'2d\');\n"2037" context.font = Font;\n"2038" var WidthArray = Array(StringArray.length);\n"2039" var nMaxWidth = 0;\n"2040" var nHeight = 0;\n"2041" for(i = 0; i < StringArray.length; i += 2)\n"2042" {\n"2043" var nWidth0 = context.measureText(StringArray[i]).width;\n"2044" var nWidth1 = context.measureText(StringArray[i+1]).width;\n"2045" var nSum = nWidth0 + nWidth1;\n"2046" WidthArray[i] = nWidth0;\n"2047" WidthArray[i+1] = nWidth1;\n"2048" if(nSum > nMaxWidth)\n"2049" {\n"2050" nMaxWidth = nSum;\n"2051" }\n"2052" nHeight += BoxHeight;\n"2053" }\n"2054" nMaxWidth += 15;\n"2055" //bounds check.\n"2056" if(!bSecondary)\n"2057" {\n"2058" var CanvasRect = Canvas.getBoundingClientRect();\n"2059" if(y + nHeight > CanvasRect.height)\n"2060" {\n"2061" y = CanvasRect.height - nHeight;\n"2062" x += 20;\n"2063" }\n"2064" if(x + nMaxWidth > CanvasRect.width)\n"2065" {\n"2066" x = CanvasRect.width - nMaxWidth;\n"2067" }\n"2068" }\n"2069" else\n"2070" {\n"2071" x -= nMaxWidth;\n"2072" }\n"2073" context.fillStyle = \'black\';\n"2074" context.fillRect(x-1, y, nMaxWidth+2, nHeight);\n"2075" context.fillStyle = \'white\';\n"2076"\n"2077" var XPos = x;\n"2078" var XPosRight = x + nMaxWidth;\n"2079" var YPos = y + BoxHeight-2;\n"2080" for(i = 0; i < StringArray.length; i += 2)\n"2081" {\n"2082" context.fillText(StringArray[i], XPos, YPos);\n"2083" context.fillText(StringArray[i+1], XPosRight - WidthArray[i+1], YPos);\n"2084" YPos += BoxHeight;\n"2085" }\n"2086" return {\"x\":x, \"y\":y};\n"2087"}\n"2088"\n"2089"function BuildToolTipDetailed(So, nHoverToken, HoverTokenOwner, bSecond, SelectedRangeCpu, SelectedRangeGpu)\n"2090"{\n"2091" let StringArray = [];\n"2092" let groupid = So.TimerInfo[nHoverToken].group;\n"2093" \n"2094" if(S2 && S2.AA)\n"2095" {\n"2096" StringArray.push(\"Capture\");\n"2097" StringArray.push(So == S ? \"Main\" : \"Other\");\n"2098" }\n"2099"\n"2100" if(nHoverToken > -1)\n"2101" {\n"2102" StringArray.push(\"Timer\");\n"2103" StringArray.push(So.TimerInfo[nHoverToken].name);\n"2104" StringArray.push(\"Group\");\n"2105" StringArray.push(So.GroupInfo[groupid].name);\n"2106" }\n"2107" else\n"2108" {\n"2109" StringArray.push(\"\");\n"2110" StringArray.push(\"\");\n"2111" StringArray.push(\"\");\n"2112" StringArray.push(\"\");\n"2113" }\n"2114" StringArray.push(\"\");\n"2115" StringArray.push(\"\");\n"2116"\n"2117" if(RangeValid(SelectedRangeGpu))\n"2118" {\n"2119" StringArray.push(\"GPU Time\");\n"2120" StringArray.push((SelectedRangeGpu.End-SelectedRangeGpu.Begin).toFixed(3));\n"2121" }\n"2122" if(RangeValid(SelectedRangeCpu))\n"2123" {\n"2124"\n"2125" StringArray.push(\"CPU Time\");\n"2126" StringArray.push((SelectedRangeCpu.End-SelectedRangeCpu.Begin).toFixed(3));\n"2127" }\n"2128"\n"2129" if(RangeValid(SelectedRangeGpu))\n"2130" {\n"2131" StringArray.push(\"\");\n"2132" StringArray.push(\"\");\n"2133" StringArray.push(\"GPU Aggregates\");\n"2134" StringArray.push(\"\");\n"2135" }\n"2136"\n"2137" StringArray.push(\"\");\n"2138" StringArray.push(\"\");\n"2139" StringArray.push(\"Total\");\n"2140" StringArray.push(\"\" + So.TimerInfo[nHoverToken].Sum);\n"2141" StringArray.push(\"Max\");\n"2142" StringArray.push(\"\" + So.TimerInfo[nHoverToken].Max);\n"2143" StringArray.push(\"Average\");\n"2144" StringArray.push(\"\" + So.TimerInfo[nHoverToken].Average);\n"2145" StringArray.push(\"Count\");\n"2146" StringArray.push(\"\" + So.TimerInfo[nHoverToken].CallCount);\n"2147"\n"2148" StringArray.push(\"\");\n"2149" StringArray.push(\"\");\n"2150" StringArray.push(\"Excl Total\");\n"2151" StringArray.push(\"\" + So.TimerInfo[nHoverToken].SumExcl);\n"2152" StringArray.push(\"Excl Max\");\n"2153" StringArray.push(\"\" + So.TimerInfo[nHoverToken].MaxExcl);\n"2154" StringArray.push(\"Excl Average\");\n"2155" StringArray.push(\"\" + So.TimerInfo[nHoverToken].AverageExcl);\n"2156" StringArray.push(\"Excl Count\");\n"2157" StringArray.push(\"\" + So.TimerInfo[nHoverToken].CallCountExcl);\n"2158"\n"2159" StringArray.push(\"\");\n"2160" StringArray.push(\"\");\n"2161" StringArray.push(\"Max/Frame\");\n"2162" StringArray.push(\"\" + So.TimerInfo[nHoverToken].FrameMax);\n"2163" StringArray.push(\"Average Time/Frame\");\n"2164" StringArray.push(\"\" + So.TimerInfo[nHoverToken].FrameAverage);\n"2165" StringArray.push(\"Average Count/Frame\");\n"2166" StringArray.push(\"\" + So.TimerInfo[nHoverToken].FrameCallAverage);\n"2167"\n"2168" StringArray.push(\"\");\n"2169" StringArray.push(\"\");\n"2170" StringArray.push(\"Excl Max/Frame\");\n"2171" StringArray.push(\"\" + So.TimerInfo[nHoverToken].FrameMaxExcl);\n"2172" StringArray.push(\"Excl Average Time/Frame\");\n"2173" StringArray.push(\"\" + So.TimerInfo[nHoverToken].FrameAverageExcl);\n"2174"\n"2175"\n"2176" let Time = fDetailedOffset + fDetailedRange * (DetailedViewMouseX / nWidth);\n"2177" if(bSecond)\n"2178" Time += fDetailedOffsetSecond;\n"2179" let FrameTime = new Object();\n"2180" let Frame = CalculateTimers2(FrameTime, nHoverToken, Time, S);\n"2181"\n"2182" StringArray.push(\"\");\n"2183" StringArray.push(\"\");\n"2184"\n"2185" StringArray.push(\"Detailed Capture\");\n"2186" StringArray.push(\"\");\n"2187" StringArray.push(\"Frames\");\n"2188" StringArray.push(So.Frames.length);\n"2189" StringArray.push(\"Time\");\n"2190" StringArray.push(DetailedTotal(So).toFixed(2) + \"ms\");\n"2191" return StringArray;\n"2192"}\n"2193"\n"2194"\n"2195"function DrawHoverToolTip()\n"2196"{\n"2197" ProfileEnter(\"DrawHoverToolTip\");\n"2198" let StringArray = [];\n"2199" let StringArray2;\n"2200"\n"2201"\n"2202" if(Mode == ModeDetailed)\n"2203" {\n"2204" if(RangeValid(RangeSelect) && RangeSelect.Index >= 0)\n"2205" {\n"2206" let Source = RangeSelect.Second ? S2 : S;\n"2207" let ti = Source.TimerInfo[RangeSelect.Index];\n"2208" let isGpu = Source.GroupInfo[ti.group].isgpu;\n"2209" let cpuRange = isGpu ? null : RangeSelect;\n"2210" let gpuRange = isGpu ? RangeSelect : null;\n"2211" let StringArrayWorst = BuildToolTipDetailed(Source, RangeSelect.Index, null, 0, cpuRange, gpuRange);\n"2212" DrawToolTip(StringArrayWorst, CanvasDetailedView, 0, nHeight);\n"2213" }\n"2214" }\n"2215"\n"2216" if(ToolTipImmediate != null)\n"2217" {\n"2218" DrawToolTip(ToolTipImmediate, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n"2219" ToolTipImmediate = null;\n"2220"\n"2221" }\n"2222" else if(nHoverToken != -1)\n"2223" {\n"2224"\n"2225" let bShowTimers = Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups;\n"2226" if(bShowTimers)\n"2227" {\n"2228" // var StringArray = [];\n"2229" let groupid = S.TimerInfo[nHoverToken].group;\n"2230" StringArray.push(\"Timer\");\n"2231" StringArray.push(S.TimerInfo[nHoverToken].name);\n"2232" StringArray.push(\"Group\");\n"2233" StringArray.push(S.GroupInfo[groupid].name);\n"2234"\n"2235" StringArray.push(\"\");\n"2236" StringArray.push(\"\");\n"2237" let Timer = S.TimerInfo[nHoverToken];\n"2238" StringArray.push(\"Average\");\n"2239" StringArray.push(Timer.average);\n"2240" StringArray.push(\"Max\");\n"2241" StringArray.push(Timer.max);\n"2242" StringArray.push(\"Excl Max\");\n"2243" StringArray.push(Timer.exclmax);\n"2244" StringArray.push(\"Excl Average\");\n"2245" StringArray.push(Timer.exclaverage);\n"2246" StringArray.push(\"Call Average\");\n"2247" StringArray.push(Timer.callaverage);\n"2248" StringArray.push(\"Call Count\");\n"2249" StringArray.push(Timer.callcount);\n"2250"\n"2251" StringArray.push(\"\");\n"2252" StringArray.push(\"\");\n"2253"\n"2254"\n"2255" StringArray.push(\"Group\");\n"2256" StringArray.push(S.GroupInfo[groupid].name);\n"2257" StringArray.push(\"Average\");\n"2258" StringArray.push(S.GroupInfo[groupid].average);\n"2259" StringArray.push(\"Max\");\n"2260" StringArray.push(S.GroupInfo[groupid].max);\n"2261"\n"2262" StringArray.push(\"\");\n"2263" StringArray.push(\"\");\n"2264"\n"2265" StringArray.push(\"Timer Capture\");\n"2266" StringArray.push(\"\");\n"2267" StringArray.push(\"Frames\");\n"2268" StringArray.push(S.AggregateInfo.Frames);\n"2269" StringArray.push(\"Time\");\n"2270" StringArray.push(S.AggregateInfo.Time.toFixed(2) + \"ms\");\n"2271"\n"2272"\n"2273" }\n"2274" else\n"2275" {\n"2276" let cpu = S == HoverTokenOwner ? RangeCpu : null;\n"2277" let gpu = S == HoverTokenOwner ? RangeGpu : null;\n"2278" StringArray = BuildToolTipDetailed(S, nHoverToken, HoverTokenOwner, 0, cpu, gpu);\n"2279" let nCompareHoverToken = TimerRemapReverse[nHoverToken];\n"2280" if(nCompareHoverToken > -1)\n"2281" {\n"2282" let cpu = S2 == HoverTokenOwner ? RangeCpu : null;\n"2283" let gpu = S2 == HoverTokenOwner ? RangeGpu : null;\n"2284" StringArray2 = BuildToolTipDetailed(S2, nCompareHoverToken, HoverTokenOwner, 1, cpu, gpu);\n"2285" }\n"2286" }\n"2287" if(ToolTipCorner)\n"2288" {\n"2289" let R = DrawToolTip(StringArray, CanvasDetailedView, nWidth, nHeight);\n"2290" if(StringArray2)\n"2291" DrawToolTip(StringArray2, CanvasDetailedView, R.x-15, R.y, 1);\n"2292" }\n"2293" else\n"2294" {\n"2295" let R = DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n"2296" if(StringArray2)\n"2297" DrawToolTip(StringArray2, CanvasDetailedView, R.x-15, R.y, 1);\n"2298" }\n"2299" }\n"2300" else if(nHoverCSCpu >= 0)\n"2301" {\n"2302" StringArray = [];\n"2303" StringArray.push(\"Context Switch\");\n"2304" StringArray.push(\"\");\n"2305" StringArray.push(\"\");\n"2306" StringArray.push(\"\");\n"2307" StringArray.push(\"Cpu\");\n"2308" StringArray.push(\"\" + nHoverCSCpu);\n"2309" StringArray.push(\"EfficiencyClass\");\n"2310" StringArray.push(\"\" + S.CoreEfficiencyClass[nHoverCSCpu]);\n"2311" StringArray.push(\"Begin\");\n"2312" StringArray.push(\"\" + RangeCpu.Begin);\n"2313" StringArray.push(\"End\");\n"2314" StringArray.push(\"\" + RangeCpu.End);\n"2315" if(ToolTipCorner)\n"2316" {\n"2317" DrawToolTip(StringArray, CanvasDetailedView, nWidth, nHeight);\n"2318" }\n"2319" else\n"2320" DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n"2321" }\n"2322" ProfileLeave();\n"2323"}\n"2324"\n"2325"function FormatMeta(Value, Dec)\n"2326"{\n"2327" if(!Value)\n"2328" {\n"2329" Value = \"0\";\n"2330" }\n"2331" else\n"2332" {\n"2333" Value = \'\' + Value.toFixed(Dec);\n"2334" }\n"2335" return Value;\n"2336"}\n"2337"\n"2338"function FilterMatch(FilterArray, value)\n"2339"{\n"2340" if(!FilterArray)\n"2341" return true;\n"2342" for(var i = 0; i < FilterArray.length; ++i)\n"2343" {\n"2344" var res = value.search(FilterArray[i]);\n"2345" if(res<0)\n"2346" return false;\n"2347" }\n"2348" return true;\n"2349"}\n"2350"\n"2351"\n"2352"function DrawBarView()\n"2353"{\n"2354" ProfileEnter(\"DrawBarView\");\n"2355" Invalidate++;\n"2356" nHoverToken = -1;\n"2357" var context = CanvasDetailedView.getContext(\'2d\');\n"2358" context.clearRect(0, 0, nWidth, nHeight);\n"2359"\n"2360" var Height = BoxHeight;\n"2361" var Width = nWidth;\n"2362" var NameWidth = Math.max(S.TimerNameWidth, S.GroupNameWidth) + 20;\n"2363"\n"2364" //clamp offset to prevent scrolling into the void\n"2365" var nTotalRows = 0;\n"2366" for(var groupid in S.GroupInfo)\n"2367" {\n"2368" if(!GroupsDisabled[S.GroupInfo[groupid].name])\n"2369" {\n"2370" nTotalRows += S.GroupInfo[groupid].TimerArray.length + 1;\n"2371" }\n"2372" }\n"2373" var nTotalRowPixels = nTotalRows * Height;\n"2374" var nFrameRows = nHeight - BoxHeight;\n"2375"\n"2376" if(nOffsetBarsY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\n"2377" {\n"2378" nOffsetBarsY = nTotalRowPixels - nFrameRows;\n"2379" }\n"2380" var ColumnsWidthBefore = new Array(ColumnsWidth.length);\n"2381" for(var i = 0; i < ColumnsWidth.length; ++i)\n"2382" {\n"2383" ColumnsWidthBefore[i] = ColumnsWidth[i];\n"2384" }\n"2385"\n"2386" var Y = -nOffsetBarsY + BoxHeight;\n"2387" let TimersGroups = Mode == ModeTimers_Threads || Mode == ModeTimers_Groups;\n"2388" if(TimersGroups)\n"2389" {\n"2390" nOffsetBarsX = 0;\n"2391" }\n"2392" var XBase = -nOffsetBarsX;\n"2393" var nColorIndex = 0;\n"2394"\n"2395" context.fillStyle = \'white\';\n"2396" context.font = Font;\n"2397" var bMouseIn = 0;\n"2398" var RcpReferenceTime = 1.0 / ReferenceTime;\n"2399" var CountWidth = 12 * FontWidth;\n"2400" var nMetaLen = S.TimerInfo[0].meta.length;\n"2401" var nMetaCharacters = 10;\n"2402" var InnerBoxHeight = BoxHeight-2;\n"2403" var TimerLen = 8; //todo: fix max digits.\n"2404" var TimerWidth = TimerLen * FontWidth;\n"2405" var nWidthBars = nBarsWidth+2;\n"2406" var nWidthMs = TimerWidth+2+10;\n"2407" var R = 0;\n"2408" var AllColumns = TimersGroups != 0;\n"2409"\n"2410"\n"2411"\n"2412" for(var i = 0; i < nMetaLen; ++i)\n"2413" {\n"2414" if(nMetaCharacters < MetaNames[i].length)\n"2415" nMetaCharacters = MetaNames[i].length;\n"2416" }\n"2417" var nWidthMeta = nMetaCharacters * FontWidth + 6;\n"2418" function HeaderMouseHandle(XBegin, X, Header)\n"2419" {\n"2420" var bMouseIn = DetailedViewMouseY >= 0 && DetailedViewMouseY < BoxHeight && DetailedViewMouseX < X && DetailedViewMouseX > XBegin;\n"2421" if(bMouseIn)\n"2422" {\n"2423" SortColumnMouseOverNext = Header;\n"2424" }\n"2425" }\n"2426" function HeaderString(Header)\n"2427" {\n"2428" if(Header == SortColumnMouseOver)\n"2429" {\n"2430" return Header + (SortColumnOrderFlip ? \'<\' : \'>\');\n"2431" }\n"2432" else\n"2433" {\n"2434" return Header;\n"2435" }\n"2436"\n"2437" }\n"2438" function DrawHeaderSplit(Header)\n"2439" {\n"2440" if(ColumnsEnabled[R]||AllColumns)\n"2441" {\n"2442" context.fillStyle = \'white\';\n"2443" context.fillText(HeaderString(Header), X, Height-FontAscent);\n"2444" var XBegin = X;\n"2445" X += nWidthBars;\n"2446" context.fillStyle = nBackColorOffset;\n"2447" X += ColumnsWidth[R];\n"2448" if(X >= NameWidth)\n"2449" {\n"2450" context.fillRect(X-3, 0, 1, nHeight);\n"2451" }\n"2452" HeaderMouseHandle(XBegin, X, Header);\n"2453" }\n"2454" R++;\n"2455" }\n"2456" function DrawHeaderSplitSingle(Header, Col)\n"2457" {\n"2458" if(ColumnsEnabled[Col]||AllColumns)\n"2459" {\n"2460" context.fillStyle = \'white\';\n"2461" context.fillText(HeaderString(Header), X, Height-FontAscent);\n"2462" var XBegin = X;\n"2463" X += ColumnsWidth[R];\n"2464" context.fillStyle = nBackColorOffset;\n"2465" if(X >= NameWidth)\n"2466" {\n"2467" context.fillRect(X-3, 0, 1, nHeight);\n"2468" }\n"2469" HeaderMouseHandle(XBegin, X, Header);\n"2470" }\n"2471" R++;\n"2472" }\n"2473" function DrawHeaderSplitLeftRight(HeaderLeft, HeaderRight, Width)\n"2474" {\n"2475" context.textAlign = \'left\';\n"2476" context.fillStyle = \'white\';\n"2477" context.fillText(HeaderLeft, X, Height-FontAscent);\n"2478" var XBegin = X;\n"2479" X += Width;\n"2480" context.textAlign = \'right\';\n"2481" context.fillText(HeaderRight, X-5, Height-FontAscent);\n"2482" context.textAlign = \'left\';\n"2483" context.fillStyle = nBackColorOffset;\n"2484" if(X >= NameWidth)\n"2485" {\n"2486" context.fillRect(X-3, 0, 1, nHeight);\n"2487" }\n"2488" HeaderMouseHandle(XBegin, X, HeaderLeft);\n"2489" }\n"2490" function DrawTimer(Value, Color)\n"2491" {\n"2492" if(ColumnsEnabled[R]||AllColumns)\n"2493" {\n"2494" var Prc = Value * RcpReferenceTime;\n"2495" var YText = Y+Height-FontAscent;\n"2496" if(Prc > 1)\n"2497" {\n"2498" Prc = 1;\n"2499" }\n"2500" context.textAlign = \'left\';\n"2501" context.fillStyle = Color;\n"2502" context.fillRect(X+1, Y+1, Prc * nBarsWidth, InnerBoxHeight);\n"2503" var TimerText = Value.toFixed(2);\n"2504" var W = context.measureText(TimerText).width + FontWidth;\n"2505" ColumnsWidth[R] = Math.max(W, ColumnsWidth[R]);\n"2506" X += nWidthBars;\n"2507" X += ColumnsWidth[R];\n"2508" context.fillStyle = \'white\';\n"2509" context.textAlign = \'right\';\n"2510" context.fillText(TimerText, X - FontWidth, YText);\n"2511" context.textAlign = \'left\';\n"2512" }\n"2513" R++;\n"2514" }\n"2515" function DrawCount(Str)\n"2516" {\n"2517" if(ColumnsEnabled[R]||AllColumns)\n"2518" {\n"2519" X += ColumnsWidth[R];\n"2520" context.fillStyle = \'white\';\n"2521" context.textAlign = \'right\';\n"2522" var YText = Y+Height-FontAscent;\n"2523" context.fillText(Str, X-6, YText);\n"2524" var W = Math.max(80, context.measureText(Str).width + FontWidth * 2);\n"2525" ColumnsWidth[R] = Math.max(W, ColumnsWidth[R]);\n"2526" }\n"2527" R++;\n"2528"\n"2529" }\n"2530"\n"2531"\n"2532" function DrawMeta(Value, Width, Dec, YText, Col)\n"2533" {\n"2534" if(ColumnsEnabled[Col]||AllColumns)\n"2535" {\n"2536" Value = FormatMeta(Value, Dec);\n"2537" X += (FontWidth*Width);\n"2538" ColumnsWidth[R] = FontWidth*Width;\n"2539" context.textAlign = \'right\';\n"2540" context.fillText(Value, X-FontWidth, YText);\n"2541" context.textAlign = \'left\';\n"2542" }\n"2543" R++;\n"2544" }\n"2545"\n"2546"\n"2547"\n"2548" function DrawTimerRow(timerid, showgroup)\n"2549" {\n"2550" R = 0;\n"2551" var Timer = S.TimerInfo[timerid];\n"2552" var Average = Timer.average;\n"2553" var Max = Timer.max;\n"2554" var Min = Timer.min;\n"2555" var Spike = Timer.spike;\n"2556" var ExclusiveMax = Timer.exclmax;\n"2557" var ExclusiveAverage = Timer.exclaverage;\n"2558" var CallAverage = Timer.callaverage;\n"2559" var CallCount = Timer.callcount;\n"2560" var YText = Y+Height-FontAscent;\n"2561" var Color = g_Colors[Timer.cid];\n"2562" X = NameWidth + XBase;\n"2563"\n"2564" nColorIndex = 1-nColorIndex;\n"2565" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"2566" if(bMouseIn)\n"2567" {\n"2568" nHoverToken = timerid;\n"2569" }\n"2570" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2571" context.fillRect(0, Y, Width, FontHeight+2);\n"2572"\n"2573" DrawTimer(Average, Color);\n"2574" DrawTimer(Max, Color);\n"2575" DrawTimer(Timer.total, Color);\n"2576" DrawTimer(Min, Color);\n"2577" DrawCount(Spike.toFixed(2) + \'%\');\n"2578" DrawTimer(CallAverage, Color);\n"2579" DrawCount(CallCount);\n"2580" DrawTimer(ExclusiveAverage, Color);\n"2581" DrawTimer(ExclusiveMax, Color);\n"2582"\n"2583" context.fillStyle = \'white\';\n"2584" var Col = R;\n"2585" for(var j = 0; j < nMetaLen; ++j)\n"2586" {\n"2587" DrawMeta(Timer.meta[j], MetaLengths[j], 0, YText, Col + j);\n"2588" DrawMeta(Timer.metaavg[j], MetaLengthsAvg[j], 2, YText, Col + j);\n"2589" DrawMeta(Timer.metamax[j], MetaLengthsMax[j], 0, YText, Col + j);\n"2590" }\n"2591" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2592" context.fillRect(0, Y, NameWidth, Height);\n"2593" context.textAlign = \'right\';\n"2594" context.fillStyle = Color;\n"2595" context.fillText(Timer.name, NameWidth - 5, YText);\n"2596" context.textAlign = \'left\';\n"2597" if(showgroup)\n"2598" {\n"2599" context.fillStyle = \'white\';\n"2600" context.fillText(S.GroupInfo[Timer.group].name, 1, YText);\n"2601" }\n"2602" }\n"2603" if(SortColumn && Mode == ModeTimers)\n"2604" {\n"2605" var OrderArray = new Array(S.TimerInfo.length);\n"2606" var KeyArray = new Array(S.TimerInfo.length);\n"2607" for(var idx in GroupOrder)\n"2608" {\n"2609" var Group = S.GroupInfo[idx];\n"2610" if((!GroupsDisabled[Group.name]) && FilterMatch(FilterGroup, Group.name))\n"2611" {\n"2612" var TimerArray = Group.TimerArray;\n"2613" for(var timerindex in TimerArray)\n"2614" {\n"2615" var timerid = TimerArray[timerindex];\n"2616" if(FilterMatch(FilterTimer, S.TimerInfo[timerid].name))\n"2617" {\n"2618" OrderArray.push(timerid);\n"2619" NameWidth = Math.max(S.TimerInfo[timerid].wtotal, NameWidth);\n"2620" }\n"2621" }\n"2622" }\n"2623" }\n"2624" var KeyFunc = null;\n"2625" switch(SortColumn)\n"2626" {\n"2627" case 1: KeyFunc = function (a) { return S.TimerInfo[a].average; }; break;\n"2628" case 2: KeyFunc = function (a) { return S.TimerInfo[a].max; }; break;\n"2629" case 3: KeyFunc = function (a) { return S.TimerInfo[a].total; }; break;\n"2630" case 4: KeyFunc = function (a) { return S.TimerInfo[a].min; }; break;\n"2631" case 5: KeyFunc = function (a) { return S.TimerInfo[a].spike; }; break;\n"2632" case 6: KeyFunc = function (a) { return S.TimerInfo[a].callaverage; }; break;\n"2633" case 7: KeyFunc = function (a) { return S.TimerInfo[a].callcount; }; break;\n"2634" case 8: KeyFunc = function (a) { return S.TimerInfo[a].exclaverage; }; break;\n"2635" case 9: KeyFunc = function (a) { return S.TimerInfo[a].exclmax; }; break;\n"2636" }\n"2637"\n"2638" var Flip = SortColumnOrderFlip == 1 ? -1 : 1;\n"2639" OrderArray.sort(function(a,b) { return Flip * (KeyFunc(b) - KeyFunc(a)); } );\n"2640"\n"2641" for(var i in OrderArray)\n"2642" {\n"2643" DrawTimerRow(OrderArray[i], 1);\n"2644" Y += Height;\n"2645" }\n"2646"\n"2647" }\n"2648" else if(Mode == ModeTimers_Threads)\n"2649" {\n"2650" for(var i = 0; i < S.ThreadNames.length; ++i)\n"2651" {\n"2652" if((IsThreadActive(S.ThreadNames[i])) && FilterMatch(FilterTimer, S.ThreadNames[i]))\n"2653" {\n"2654" var X = 0;\n"2655" var YText = Y+Height-FontAscent;\n"2656" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"2657" nColorIndex = 1-nColorIndex;\n"2658" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2659" context.fillRect(0, Y, Width, FontHeight+2);\n"2660" var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n"2661" context.fillStyle = ThreadColor;\n"2662" context.fillText(S.ThreadNames[i], 1, YText);\n"2663" context.textAlign = \'left\';\n"2664" Y += Height;\n"2665" for(var idx in GroupOrder)\n"2666" {\n"2667" R = 0;\n"2668" var groupid = GroupOrder[idx];\n"2669" var Group = S.GroupInfo[groupid];\n"2670" var PerThreadTimer = S.ThreadGroupTimeArray[i][groupid];\n"2671" var PerThreadTimerTotal = S.ThreadGroupTimeTotalArray[i][groupid];\n"2672" if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (!GroupsDisabled[Group.name]) && FilterMatch(FilterGroup, Group.name))\n"2673" {\n"2674" var GColor = GroupColors ? g_Colors[S.GroupInfo[groupid].cid] : \'white\';\n"2675" var X = 0;\n"2676" nColorIndex = 1-nColorIndex;\n"2677" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"2678" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2679" context.fillRect(0, Y, Width, nHeight);\n"2680" context.fillStyle = GColor;\n"2681" context.textAlign = \'right\';\n"2682" context.fillText(Group.name, NameWidth - 5, Y+Height-FontAscent);\n"2683" context.textAlign = \'left\';\n"2684" X += NameWidth;\n"2685" DrawTimer(PerThreadTimer, GColor);\n"2686" DrawTimer(PerThreadTimerTotal, GColor);\n"2687" Y += Height;\n"2688" }\n"2689" }\n"2690" }\n"2691" }\n"2692" }\n"2693" else\n"2694" {\n"2695" for(var idx in GroupOrder)\n"2696" {\n"2697" var groupid = GroupOrder[idx];\n"2698" var Group = S.GroupInfo[groupid];\n"2699" var GColor = GroupColors ? g_Colors[S.GroupInfo[groupid].cid] : \'white\';\n"2700" if((!GroupsDisabled[Group.name]) && FilterMatch(FilterGroup, Group.name))\n"2701" {\n"2702" R = 0;\n"2703" var TimerArray = Group.TimerArray;\n"2704" var X = XBase;\n"2705" nColorIndex = 1-nColorIndex;\n"2706" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"2707" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2708" context.fillRect(0, Y, Width, FontHeight+2);\n"2709" context.fillStyle = GColor;\n"2710" context.fillText(Group.name, 1, Y+Height-FontAscent);\n"2711" X += NameWidth;\n"2712" DrawTimer(Group.average, GColor);\n"2713" DrawTimer(Group.max, GColor);\n"2714" DrawTimer(Group.total, GColor);\n"2715"\n"2716" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2717" context.fillRect(0, Y, NameWidth, FontHeight+2);\n"2718" context.fillStyle = GColor;\n"2719" context.fillText(Group.name, 1, Y+Height-FontAscent);\n"2720"\n"2721" Y += Height;\n"2722" let TimersGroups = Mode == ModeTimers_Threads || Mode == ModeTimers_Groups;\n"2723" if(TimersGroups)\n"2724" {\n"2725" for(var i = 0; i < S.ThreadNames.length; ++i)\n"2726" {\n"2727" R = 0;\n"2728" var PerThreadTimer = S.ThreadGroupTimeArray[i][groupid];\n"2729" var PerThreadTimerTotal = S.ThreadGroupTimeTotalArray[i][groupid];\n"2730" if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (IsThreadActive(S.ThreadNames[i])) && FilterMatch(FilterTimer, S.ThreadNames[i]))\n"2731" {\n"2732" var YText = Y+Height-FontAscent;\n"2733" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n"2734" nColorIndex = 1-nColorIndex;\n"2735" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"2736" context.fillRect(0, Y, Width, FontHeight+2);\n"2737" var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n"2738" context.fillStyle = ThreadColor;\n"2739" context.textAlign = \'right\';\n"2740" context.fillText(S.ThreadNames[i], NameWidth - 5, YText);\n"2741" context.textAlign = \'left\';\n"2742" X = NameWidth;\n"2743" DrawTimer(PerThreadTimer, ThreadColor);\n"2744" X += nWidthBars + ColumnsWidth[R++];\n"2745" DrawTimer(PerThreadTimerTotal, ThreadColor);\n"2746" Y += Height;\n"2747" }\n"2748" }\n"2749" }\n"2750" else\n"2751" {\n"2752" for(var timerindex in TimerArray)\n"2753" {\n"2754" var timerid = TimerArray[timerindex];\n"2755" if(FilterMatch(FilterTimer, S.TimerInfo[timerid].name))\n"2756" {\n"2757" DrawTimerRow(timerid, 0);\n"2758" Y += Height;\n"2759" }\n"2760" }\n"2761" }\n"2762" }\n"2763" }\n"2764" }\n"2765" X = 0;\n"2766" R = 0;\n"2767" context.fillStyle = nBackColorOffset;\n"2768" context.fillRect(0, 0, Width, Height);\n"2769" context.fillStyle = \'white\';\n"2770" SortColumnMouseOverNext = null;\n"2771"\n"2772" if(Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"2773" {\n"2774" if(Mode == ModeTimers_Threads)\n"2775" {\n"2776" DrawHeaderSplitLeftRight(StrThread, StrGroup, NameWidth);\n"2777" DrawHeaderSplit(StrAverage);\n"2778" DrawHeaderSplit(StrTotal);\n"2779" }\n"2780" else\n"2781" {\n"2782" DrawHeaderSplitLeftRight(StrGroup, StrThread, NameWidth);\n"2783" DrawHeaderSplit(StrAverage);\n"2784" DrawHeaderSplit(StrMax);\n"2785" DrawHeaderSplit(StrTotal);\n"2786" }\n"2787" }\n"2788" else\n"2789" {\n"2790" X = NameWidth + XBase;\n"2791" DrawHeaderSplit(StrAverage);\n"2792" DrawHeaderSplit(StrMax);\n"2793" DrawHeaderSplit(StrTotal);\n"2794" DrawHeaderSplit(StrMin);\n"2795" DrawHeaderSplitSingle(StrSpike, R);\n"2796" DrawHeaderSplit(StrCallAverage);\n"2797" DrawHeaderSplitSingle(StrCount, R);\n"2798" DrawHeaderSplit(StrExclAverage);\n"2799" DrawHeaderSplit(StrExclMax);\n"2800" var Col = R;\n"2801" for(var i = 0; i < nMetaLen; ++i)\n"2802" {\n"2803" DrawHeaderSplitSingle(MetaNames[i], Col + i);\n"2804" DrawHeaderSplitSingle(MetaNames[i] + \" Avg\", Col + i);\n"2805" DrawHeaderSplitSingle(MetaNames[i] + \" Max\", Col + i);\n"2806" }\n"2807" X = 0;\n"2808" context.fillStyle = nBackColorOffset;\n"2809" context.fillRect(0, 0, NameWidth, Height);\n"2810" context.fillStyle = \'white\';\n"2811"\n"2812" DrawHeaderSplitLeftRight(StrGroup, StrTimer, NameWidth);\n"2813"\n"2814" }\n"2815"\n"2816" var ColumnsChanged = false;\n"2817" for(var i = 0; i < ColumnsWidth.length; ++i)\n"2818" {\n"2819" if(ColumnsWidthBefore[i] != ColumnsWidth[i])\n"2820" {\n"2821" ColumnsChanged = true;\n"2822" }\n"2823" }\n"2824" if(ColumnsChanged)\n"2825" {\n"2826" Invalidate = 0;\n"2827" }\n"2828"\n"2829"\n"2830"\n"2831"\n"2832" ProfileLeave();\n"2833"}\n"2834"\n"2835"var CounterNameWidth = 100;\n"2836"var CounterValueWidth = 100;\n"2837"var CounterLimitWidth = 100;\n"2838"\n"2839"var FormatCounterDefault = 0;\n"2840"var FormatCounterBytes = 1;\n"2841"var FormatCounterBytesExt = [ \"b\",\"kb\",\"mb\",\"gb\",\"tb\",\"pb\", \"eb\",\"zb\", \"yb\" ];\n"2842"\n"2843"function ShiftRight10(v)\n"2844"{\n"2845" if(v > 1024)\n"2846" {\n"2847" return v / 1024.0;\n"2848" }\n"2849" else\n"2850" {\n"2851" return v >> 10;\n"2852" }\n"2853"}\n"2854"\n"2855"\n"2856"function FormatCounter(Format, Counter)\n"2857"{\n"2858" if(!Counter)\n"2859" {\n"2860" return \'0\';\n"2861" }\n"2862" var Negative = 0;\n"2863" if(Counter < 0)\n"2864" {\n"2865" Counter = -Counter;\n"2866" Negative = 1;\n"2867" if(Counter < 0) // handle INT_MIN\n"2868" {\n"2869" Counter = -(Counter+1);\n"2870" if(Counter < 0)\n"2871" {\n"2872" return \'?\';\n"2873" }\n"2874" }\n"2875" }\n"2876" var str = Negative ? \'-\' :\'\' ;\n"2877" if(Format == FormatCounterDefault)\n"2878" {\n"2879" var Seperate = 0;\n"2880" var result = \'\';\n"2881" while (Counter)\n"2882" {\n"2883" if (Seperate)\n"2884" {\n"2885" result += \'.\';\n"2886" }\n"2887" Seperate = 1;\n"2888" for (var i = 0; Counter && i < 3; ++i)\n"2889" {\n"2890" var Digit = Math.floor(Counter % 10);\n"2891" Counter = Math.floor(Counter / 10);\n"2892" result += \'\' + Digit;\n"2893" }\n"2894" }\n"2895"\n"2896" for(var i = 0; i < result.length; ++i)\n"2897" {\n"2898" str += result[result.length-1-i];\n"2899" }\n"2900" return str;\n"2901" }\n"2902" else if(Format == FormatCounterBytes)\n"2903" {\n"2904" var Shift = 0;\n"2905" var Divisor = 1;\n"2906" var CountShifted = ShiftRight10(Counter);\n"2907" while(CountShifted)\n"2908" {\n"2909" Divisor <<= 10;\n"2910" CountShifted = ShiftRight10(CountShifted);\n"2911" Shift++;\n"2912" }\n"2913" if(Shift)\n"2914" {\n"2915" return str + (Counter / Divisor).toFixed(2) + \'\' + FormatCounterBytesExt[Shift];\n"2916" }\n"2917" else\n"2918" {\n"2919" return str + Counter.toFixed(2) + \'\' + FormatCounterBytesExt[0];\n"2920" }\n"2921" }\n"2922" return \'?\'\n"2923"}\n"2924"function DrawCounterView()\n"2925"{\n"2926" ProfileEnter(\"DrawCounterView\");\n"2927" Invalidate++;\n"2928" nHoverToken = -1;\n"2929" var context = CanvasDetailedView.getContext(\'2d\');\n"2930" context.clearRect(0, 0, nWidth, nHeight);\n"2931"\n"2932" var Height = BoxHeight;\n"2933" var Width = nWidth;\n"2934" //clamp offset to prevent scrolling into the void\n"2935" var nTotalRows = S.CounterInfo.length;\n"2936" var nTotalRowPixels = nTotalRows * Height;\n"2937" var nFrameRows = nHeight - BoxHeight;\n"2938" if(nOffsetCountersY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\n"2939" {\n"2940" nOffsetCountersY = nTotalRowPixels - nFrameRows;\n"2941" }\n"2942"\n"2943" var CounterNameWidthTemp = 10;\n"2944" var CounterValueWidthTemp = 10;\n"2945" var CounterLimitWidthTemp = 10;\n"2946"\n"2947" var CounterWidth = 150;\n"2948" var Y = -nOffsetCountersY + BoxHeight;\n"2949" var X = 0;\n"2950" var nColorIndex = 0;\n"2951" context.fillStyle = \'white\';\n"2952" context.font = Font;\n"2953" var bMouseIn = 0;\n"2954" function DrawHeaderSplitSingle(Header, Width)\n"2955" {\n"2956" context.fillStyle = \'white\';\n"2957" context.fillText(Header, X, Height-FontAscent);\n"2958" X += Width;\n"2959" context.fillStyle = nBackColorOffset;\n"2960" context.fillRect(X-3, 0, 1, nHeight);\n"2961" }\n"2962" function DrawHeaderSplitSingleRight(Header, Width)\n"2963" {\n"2964" X += Width;\n"2965" context.fillStyle = \'white\';\n"2966" context.textAlign = \'right\';\n"2967" context.fillText(Header, X - FontWidth, Height-FontAscent);\n"2968" context.fillStyle = nBackColorOffset;\n"2969" context.fillRect(X, 0, 1, nHeight);\n"2970" context.textAlign = \'left\';\n"2971" }\n"2972" var TimerLen = 6;\n"2973" var TimerWidth = TimerLen * FontWidth;\n"2974" nHoverCounter = -1;\n"2975" function CounterIndent(Level)\n"2976" {\n"2977" return Level * 4 * FontWidth;\n"2978" }\n"2979" function Max(a, b)\n"2980" {\n"2981" return a > b ? a : b;\n"2982" }\n"2983"\n"2984" function DrawCounterRecursive(Index)\n"2985" {\n"2986" var Counter = S.CounterInfo[Index];\n"2987" var Indent = CounterIndent(Counter.level);\n"2988" CounterNameWidthTemp = Max(CounterNameWidthTemp, Counter.name.length+1 + Indent / (FontWidth+1));\n"2989" CounterValueWidthTemp = Max(CounterValueWidthTemp, Counter.formatted.length);\n"2990" CounterLimitWidthTemp = Max(CounterLimitWidthTemp, Counter.formattedlimit.length);\n"2991"\n"2992" var X = 0;\n"2993" nColorIndex = 1-nColorIndex;\n"2994" var HeightExpanded = Counter.Expanded ? Height * 5 : Height\n"2995"\n"2996" bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + HeightExpanded;\n"2997" if(bMouseIn)\n"2998" {\n"2999" nHoverCounter = Index;\n"3000" }\n"3001" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"3002" context.fillStyle = bgcolor;\n"3003" context.fillRect(0, Y, Width, HeightExpanded);\n"3004" context.fillStyle = \'white\';\n"3005" var c = Counter.";30063007const size_t g_MicroProfileHtml_end_1_size = sizeof(g_MicroProfileHtml_end_1);3008const char g_MicroProfileHtml_end_2[] =3009"closed ? \'*\' : \' \';\n"3010" context.fillText(c + Counter.name, Indent, Y+Height-FontAscent);\n"3011" X += CounterNameWidth;\n"3012" X += CounterValueWidth - FontWidth;\n"3013" context.textAlign = \'right\';\n"3014" context.fillText(Counter.formatted, X, Y+Height-FontAscent);\n"3015" context.textAlign = \'left\';\n"3016" X += FontWidth * 4;\n"3017" var Y0 = Y + 1;\n"3018" if(Counter.limit != 0)\n"3019" {\n"3020" context.fillText(Counter.formattedlimit, X, Y+Height-FontAscent);\n"3021" X += CounterLimitWidth;\n"3022" var X0 = X + 1;\n"3023" context.fillStyle = \'white\';\n"3024" context.fillRect(X0, Y0, Counter.boxprc * (CounterWidth-2), Height-2);\n"3025" context.fillStyle = bgcolor;\n"3026" context.fillRect(X0+1, Y0+1, Counter.boxprc * (CounterWidth-4), Height-4);\n"3027" context.fillStyle = \'cyan\';\n"3028" context.fillRect(X0+1, Y0+1, Counter.counterprc * (CounterWidth-4), Height-4);\n"3029" X += CounterWidth + 10;\n"3030" }\n"3031" else\n"3032" {\n"3033" X += CounterLimitWidth;\n"3034" X += CounterWidth + 10;\n"3035" }\n"3036" var CounterHistory = Counter.counterhistory;\n"3037" if(CounterHistory)\n"3038" {\n"3039" var Prc = CounterHistory.prc;\n"3040"\n"3041" context.fillStyle = \'cyan\';\n"3042" context.strokeStyle = \'cyan\';\n"3043" context.globalAlpha = 0.5;\n"3044" context.beginPath();\n"3045" var x = X;\n"3046" var YBase = Y0 + HeightExpanded-1;\n"3047" var YOffset = -(HeightExpanded-2);\n"3048"\n"3049" context.moveTo(X, Y0);\n"3050" for(var i = 0; i < Prc.length; ++i)\n"3051" {\n"3052" context.moveTo(x, YBase);\n"3053" context.lineTo(x, YBase + Prc[i] * YOffset);\n"3054"\n"3055" x += 1;\n"3056" }\n"3057" context.stroke();\n"3058"\n"3059" x = X;\n"3060" context.globalAlpha = 1.0;\n"3061" context.beginPath();\n"3062" context.moveTo(X, YBase);\n"3063"\n"3064" for(var i = 0; i < Prc.length; ++i)\n"3065" {\n"3066" context.lineTo(x, YBase + Prc[i] * YOffset);\n"3067" x += 1;\n"3068" }\n"3069" context.stroke();\n"3070" if(bMouseIn)\n"3071" {\n"3072" var MouseGraphX = Math.floor(DetailedViewMouseX - X);\n"3073" if(MouseGraphX >= 0 && MouseGraphX < CounterHistory.history.length)\n"3074" {\n"3075" context.fillStyle = \'white\';\n"3076" var Formatted = FormatCounter(Counter.format, CounterHistory.history[MouseGraphX]);\n"3077" context.fillText(Formatted, X, Y+Height-FontAscent);\n"3078" }\n"3079" context.strokeStyle = \'orange\';\n"3080" context.beginPath();\n"3081" var CrossX = X + MouseGraphX;\n"3082" var CrossY = YBase + Prc[MouseGraphX] * YOffset;\n"3083" context.moveTo(CrossX-2, CrossY-2);\n"3084" context.lineTo(CrossX+2, CrossY+2);\n"3085" context.moveTo(CrossX+2, CrossY-2);\n"3086" context.lineTo(CrossX-2, CrossY+2);\n"3087" context.stroke();\n"3088"\n"3089" }\n"3090" X += Prc.length + 5;\n"3091" context.fillStyle = \'white\';\n"3092" context.fillText( FormatCounter(Counter.format, Counter.minvalue), X, Y + Height - FontAscent);\n"3093" X += CounterWidth + 5;\n"3094" context.fillText( FormatCounter(Counter.format, Counter.maxvalue), X, Y + Height - FontAscent);\n"3095" X += CounterWidth + 5;\n"3096" }\n"3097"\n"3098" Y += HeightExpanded;\n"3099"\n"3100" if(!Counter.closed)\n"3101" {\n"3102" var ChildIndex = Counter.firstchild;\n"3103" while(ChildIndex != -1)\n"3104" {\n"3105" DrawCounterRecursive(ChildIndex);\n"3106" ChildIndex = S.CounterInfo[ChildIndex].sibling;\n"3107" }\n"3108" }\n"3109" }\n"3110"\n"3111" for(var i = 0; i < S.CounterInfo.length; ++i)\n"3112" {\n"3113" if(S.CounterInfo[i].parent == -1)\n"3114" {\n"3115" DrawCounterRecursive(i);\n"3116" }\n"3117" }\n"3118"\n"3119" X = 0;\n"3120" context.fillStyle = nBackColorOffset;\n"3121" context.fillRect(0, 0, Width, Height);\n"3122" context.fillStyle = \'white\';\n"3123" DrawHeaderSplitSingle(\'Name\', CounterNameWidth);\n"3124" DrawHeaderSplitSingleRight(\'Value\', CounterValueWidth + (FontWidth+1));\n"3125" DrawHeaderSplitSingle(\'Limit\', CounterLimitWidth + CounterWidth + 3 * (FontWidth+1));\n"3126"\n"3127"\n"3128"\n"3129"\n"3130"\n"3131" var CounterNameWidthNew = CounterNameWidthTemp * (FontWidth+1);\n"3132" var CounterValueWidthNew = CounterValueWidthTemp * (FontWidth+1);\n"3133" var CounterLimitWidthNew = CounterLimitWidthTemp * (FontWidth+1);\n"3134" if(CounterNameWidthNew != CounterNameWidth || CounterValueWidthNew != CounterValueWidth || CounterLimitWidthNew != CounterLimitWidth)\n"3135" {\n"3136" // console.log(\'requesting redraw 0\' + CounterNameWidthNew + \'= \' + CounterNameWidth );\n"3137" // console.log(\'requesting redraw 1\' + CounterValueWidthNew + \'= \' + CounterValueWidth );\n"3138" // console.log(\'requesting redraw 2\' + CounterLimitWidthNew + \'= \' + CounterLimitWidth );\n"3139" CounterNameWidth = CounterNameWidthNew;\n"3140" CounterValueWidth = CounterValueWidthNew;\n"3141" CounterLimitWidth = CounterLimitWidthNew;\n"3142" Invalidate = 0;\n"3143" }\n"3144"\n"3145" ProfileLeave();\n"3146"}\n"3147"\n"3148"\n"3149"//preprocess context switch data to contain array per thread\n"3150"function PreprocessContextSwitchCacheItem(ThreadId)\n"3151"{\n"3152" var CSObject = S.CSwitchCache[ThreadId];\n"3153" if(ThreadId > 0 && !CSObject)\n"3154" {\n"3155" CSArrayIn = new Array();\n"3156" CSArrayOut = new Array();\n"3157" CSArrayCpu = new Array();\n"3158" var nCount = S.CSwitchTime.length;\n"3159" var j = 0;\n"3160" var TimeIn = -1.0;\n"3161" for(var i = 0; i < nCount; ++i)\n"3162" {\n"3163" var ThreadIn = S.CSwitchThreadInOutCpu[j];\n"3164" var ThreadOut = S.CSwitchThreadInOutCpu[j+1];\n"3165" var Cpu = S.CSwitchThreadInOutCpu[j+2];\n"3166" if(TimeIn < 0)\n"3167" {\n"3168" if(ThreadIn == ThreadId)\n"3169" {\n"3170" TimeIn = S.CSwitchTime[i];\n"3171" }\n"3172" }\n"3173" else\n"3174" {\n"3175" if(ThreadOut == ThreadId)\n"3176" {\n"3177" var TimeOut = S.CSwitchTime[i];\n"3178" CSArrayIn.push(TimeIn);\n"3179" CSArrayOut.push(TimeOut);\n"3180" CSArrayCpu.push(Cpu);\n"3181" TimeIn = -1;\n"3182" }\n"3183" }\n"3184" j += 3;\n"3185" }\n"3186" CSObject = new Object();\n"3187" CSObject.Size = CSArrayIn.length;\n"3188" CSObject.In = CSArrayIn;\n"3189" CSObject.Out = CSArrayOut;\n"3190" CSObject.Cpu = CSArrayCpu;\n"3191" S.CSwitchCache[ThreadId] = CSObject;\n"3192" }\n"3193"\n"3194"}\n"3195"function PreprocessContextSwitchCache()\n"3196"{\n"3197" ProfileEnter(\"PreprocessContextSwitchCache\");\n"3198" var AllThreads = {};\n"3199" var nCount = S.CSwitchTime.length;\n"3200" for(var i = 0; i < nCount; ++i)\n"3201" {\n"3202" var nThreadIn = S.CSwitchThreadInOutCpu[i];\n"3203" if(!AllThreads[nThreadIn])\n"3204" {\n"3205" AllThreads[nThreadIn] = \'\' + nThreadIn;\n"3206" var FoundThread = false;\n"3207" for(var i = 0; i < S.ThreadIds.length; ++i)\n"3208" {\n"3209" if(S.ThreadIds[i] == nThreadIn)\n"3210" {\n"3211" FoundThread = true;\n"3212" }\n"3213" }\n"3214" if(!FoundThread)\n"3215" {\n"3216" S.CSwitchOnlyThreads.push(nThreadIn);\n"3217" }\n"3218" }\n"3219" }\n"3220" for(var i = 0; i < S.CSwitchOnlyThreads.length; ++i)\n"3221" {\n"3222" PreprocessContextSwitchCacheItem(S.CSwitchOnlyThreads[i]);\n"3223" }\n"3224" for(var i = 0; i < S.ThreadIds.length; ++i)\n"3225" {\n"3226" PreprocessContextSwitchCacheItem(S.ThreadIds[i]);\n"3227" }\n"3228" function HandleMissingThread(a)\n"3229" {\n"3230" if(!S.CSwitchThreads[a])\n"3231" {\n"3232" S.CSwitchThreads[a] = {\'tid\':a, \'pid\':-1, \'t\':\'?\', \'p\':\'?\'}\n"3233" }\n"3234" }\n"3235" function CompareThreadInfo(a, b)\n"3236" {\n"3237" if(a.pid != b.pid)\n"3238" return a.pid - b.pid;\n"3239" else\n"3240" return a.tid - b.tid;\n"3241" }\n"3242" S.CSwitchOnlyThreads.sort( function(a, b){\n"3243" HandleMissingThread(a);\n"3244" HandleMissingThread(b);\n"3245" return CompareThreadInfo(S.CSwitchThreads[a], S.CSwitchThreads[b]);\n"3246" } );\n"3247"\n"3248" ProfileLeave();\n"3249"}\n"3250"\n"3251"function DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled, bSecond)\n"3252"{\n"3253" ProfileEnter(\"DrawContextSwitchBars\");\n"3254" var CSObject = S.CSwitchCache[ThreadId];\n"3255" if(CSObject && CSObject.Size > 0)\n"3256" {\n"3257" var Size = CSObject.Size;\n"3258" var In = CSObject.In;\n"3259" var Out = CSObject.Out;\n"3260" var Cpu = CSObject.Cpu;\n"3261" let nNumColors = CSwitchColors.length;\n"3262" for(var i = 0; i < Size; ++i)\n"3263" {\n"3264" var TimeIn = In[i];\n"3265" var TimeOut = Out[i];\n"3266" var ActiveCpu = Cpu[i];\n"3267"\n"3268" var X = (TimeIn - fDetailedOffset) * fScaleX;\n"3269" if(X > nWidth)\n"3270" {\n"3271" break;\n"3272" }\n"3273" var W = (TimeOut - TimeIn) * fScaleX;\n"3274" if(W > MinWidth && X+W > 0)\n"3275" {\n"3276" if(nHoverCSCpu == ActiveCpu || bDrawEnabled)\n"3277" {\n"3278" if(nHoverCSCpu == ActiveCpu)\n"3279" {\n"3280" context.fillStyle = nHoverColor;\n"3281" }\n"3282" else\n"3283" {\n"3284" if(KeyHDown){\n"3285" context.fillStyle = CSwitchColors[S.CoreEfficiencyClass[ActiveCpu] % nNumColors];\n"3286" }else{\n"3287" context.fillStyle = CSwitchColors[ActiveCpu % nNumColors];\n"3288" }\n"3289" }\n"3290" context.fillRect(X, fOffsetY, W, CSwitchHeight);\n"3291" }\n"3292" if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < fOffsetY+CSwitchHeight && DetailedViewMouseY >= fOffsetY)\n"3293" {\n"3294" nHoverCSCpuNext = ActiveCpu;\n"3295" RangeCpuNext.Off = bSecond ? fDetailedOffsetSecond : 0;\n"3296" RangeCpuNext.Begin = TimeIn;\n"3297" RangeCpuNext.End = TimeOut;\n"3298" RangeCpuNext.Thread = ThreadId;\n"3299" RangeGpuNext.Begin = RangeGpuNext.End = -1;\n"3300" }\n"3301" }\n"3302" }\n"3303" }\n"3304" else\n"3305" {\n"3306" //debug: draw context switch without cswitch\n"3307" // for(var i = 0; i < 8; ++i)\n"3308" // {\n"3309" // context.fillStyle = CSwitchColors[i];\n"3310" // context.fillRect((nWidth * i / 8) + 10, fOffsetY, nWidth / 8 - 20, CSwitchHeight);\n"3311" // }\n"3312" }\n"3313" ProfileLeave();\n"3314"}\n"3315"\n"3316"function DrawDetailedButtons(context, X, Y, Names, Callbacks, Align)\n"3317"{\n"3318" if(!Align)\n"3319" {\n"3320" Align = \"left\";\n"3321" }\n"3322" var Dir = 1;\n"3323" var Offset = 0;\n"3324" var OffsetText = 0;\n"3325" if(Align == \"right\")\n"3326" {\n"3327" Dir = -1;\n"3328" }\n"3329" else if(Align == \"center\")\n"3330" {\n"3331" Offset = -0.5;\n"3332" Align = \"left\";\n"3333" }\n"3334" let W = Array(Names.length);\n"3335" var w = 0;\n"3336" for(let i = 0; i < Names.length; ++i)\n"3337" {\n"3338" W[i] = context.measureText(Names[i]).width;\n"3339" w += W[i];\n"3340" }\n"3341" X += w * Offset;\n"3342"\n"3343" // context.textBaseline = \'top\';\n"3344" context.textAlign = Align;\n"3345" context.fillStyle = \'white\';\n"3346" var mx = DetailedViewMouseX;\n"3347" var my = DetailedViewMouseY;\n"3348" for(let i = 0; i < Names.length; ++i)\n"3349" {\n"3350" let w = W[i];\n"3351" let x0_ = X + w * Dir;\n"3352" let x0 = Math.min(X, x0_);\n"3353" let x1 = Math.max(X, x0_);\n"3354" let y0 = Y;\n"3355" let y1 = Y + FontHeight;\n"3356" context.fillStyle = nBackColors[0];\n"3357" context.fillRect(x0, y0, x1 - x0, y1 - y0);\n"3358"\n"3359" if(mx >= x0 && mx <= x1 && my >= y0 && my <= y1)\n"3360" {\n"3361" DetailedMouseOverButton = 1;\n"3362" context.fillStyle = \'cyan\';\n"3363" DetailedAddMouseEvent(99, function(){ Callbacks[i](); } );\n"3364" }\n"3365" else\n"3366" {\n"3367" context.fillStyle = \'white\';\n"3368" }\n"3369"\n"3370" context.fillText(Names[i], X, Y + FontHeight - 2);\n"3371" X += Dir * (w+FontWidth);\n"3372" }\n"3373"\n"3374" context.fillStyle = \'white\';\n"3375" context.textAlign = \'left\';\n"3376"}\n"3377"\n"3378"function DrawDetailedViewLargeHeader(context, Text, Y)\n"3379"{\n"3380" context.textAlign = \"left\";\n"3381" context.fillStyle = \"grey\";\n"3382" context.strokeStyle = \"grey\";\n"3383" context.textBaseline = \"top\";\n"3384" context.font = FontLarge;\n"3385" context.beginPath();\n"3386" context.moveTo(0, Y);\n"3387" context.lineTo(nWidth, Y);\n"3388" context.stroke();\n"3389" context.fillText(Text, 0, Y + 2);\n"3390" context.font = Font;\n"3391" context.textBaseline = \"alphabetic\";\n"3392" return Y + 2 + FontHeightLarge;\n"3393"}\n"3394"\n"3395"function DrawDetailedView(S, S0, context, MinWidth, bDrawEnabled)\n"3396"{\n"3397" if(!S || !S.Frames)\n"3398" {\n"3399" return;\n"3400" }\n"3401" let bSecond = S != S0;\n"3402" if(bDrawEnabled && !bSecond)\n"3403" {\n"3404" DrawDetailedBackground(context);\n"3405" }\n"3406"\n"3407" let colors = [ \'#ff0000\', \'#ff00ff\', \'#ffff00\'];\n"3408" let fScaleX = nWidth / fDetailedRange;\n"3409" let fOffsetY = -nOffsetY + BoxHeight;\n"3410"\n"3411"\n"3412" let nHoverTokenStack = -1;\n"3413" if(S == S0)\n"3414" {\n"3415" nHoverCounter += nHoverCounterDelta;\n"3416" if(nHoverCounter >= 255)\n"3417" {\n"3418" nHoverCounter = 255;\n"3419" nHoverCounterDelta = -nHoverCounterDelta;\n"3420" }\n"3421" if(nHoverCounter < 128)\n"3422" {\n"3423" nHoverCounter = 128;\n"3424" nHoverCounterDelta = -nHoverCounterDelta;\n"3425" }\n"3426" }\n"3427" let nHoverHigh = nHoverCounter.toString(16);\n"3428" let nHoverLow = (127+255-nHoverCounter).toString(16);\n"3429" let nHoverColor = \'#\' + nHoverHigh + nHoverHigh + nHoverHigh;\n"3430" let nHoverColorIndex;\n"3431"\n"3432" context.fillStyle = \'black\';\n"3433" context.font = Font;\n"3434" // context.textBaseline = \'alphabetic\';\n"3435"\n"3436" let nNumLogs = S.Frames[0].ts.length;\n"3437" if(S0)\n"3438" {\n"3439" let l0 = S0.Frames[0].ts.length;\n"3440" let l1 = S.Frames[0].ts.length\n"3441" if(l1 != l0)\n"3442" debugger;\n"3443" }\n"3444" let Off = fDetailedOffset;\n"3445" let XOffset = 0;\n"3446" if(bSecond)\n"3447" {\n"3448" XOffset = fDetailedOffsetSecond;\n"3449" Off += XOffset;\n"3450" }\n"3451" let fTimeEnd = Off + fDetailedRange;\n"3452"\n"3453" let FirstFrame = 0;\n"3454" for(let i = 0; i < S.Frames.length ; i++)\n"3455" {\n"3456" if(S.Frames[i].frameend < Off)\n"3457" {\n"3458" FirstFrame = i;\n"3459" }\n"3460" }\n"3461"\n"3462" let BoxHeightScaled = BoxHeight;\n"3463" let Scale = 1;\n"3464" let fExtra = 0;\n"3465" let Padding = 15;\n"3466" let SecondReverseOffset = 0;\n"3467" if(DrawDetailedFlameMode == 1)\n"3468" {\n"3469" BoxHeightScaled = Math.ceil(BoxHeight*0.5);\n"3470" fExtra = 0.5;\n"3471" }\n"3472" else if(DrawDetailedFlameMode == 2)\n"3473" {\n"3474" BoxHeightScaled = 0;\n"3475" fExtra = 1;\n"3476" }\n"3477" if(DrawDetailedCompareReverse && bSecond)\n"3478" {\n"3479" Scale = -1;\n"3480" BoxHeightScaled = -BoxHeightScaled;\n"3481" SecondReverseOffset = 5-BoxHeight;\n"3482" }\n"3483" let BoxHeightScaledPos = Math.abs(BoxHeightScaled);\n"3484" let BatchesTxtColor = [\'#ffffff\', \'#333333\'];\n"3485" let TotalBatches = 0;\n"3486" let BatchData = {};\n"3487" {\n"3488" let L = BatchData;\n"3489" L.Batches = new Array(g_Colors.length+1);\n"3490" L.BatchesTxt = new Array();\n"3491" L.BatchesTxtPos = new Array();\n"3492" for(let i = 0; i < 2; ++i)\n"3493" {\n"3494" L.BatchesTxt[i] = Array();\n"3495" L.BatchesTxtPos[i] = Array();\n"3496" }\n"3497" for(let i = 0; i < L.Batches.length; ++i)\n"3498" {\n"3499" L.Batches[i] = Array();\n"3500" }\n"3501" }\n"3502" let AddBatch = function(StackPos, index, X, Y, W, Name, NameLen, Duration, Opacity)\n"3503" {\n"3504" TotalBatches++;\n"3505" let L = BatchData;\n"3506" let O = Opacity ? Opacity : 1.0;\n"3507" O = 1-((1-O)*(1-O));\n"3508" let B = L.Batches[index];\n"3509" let txtidx = g_ColorsTextIndex[index];\n"3510" if(txtidx < 0 || txtidx > 1)\n"3511" debugger;\n"3512" let BTxt = L.BatchesTxt[txtidx];\n"3513" let BTxtPos = L.BatchesTxtPos[txtidx];\n"3514" B.push(X);\n"3515" B.push(Y);\n"3516" B.push(W);\n"3517" B.push(O);\n"3518" DebugDrawQuadCount++;\n"3519"\n"3520" let XText = X < 0 ? 0 : X;\n"3521" let WText = W - (XText-X);\n"3522" if(XText + WText > nWidth)\n"3523" {\n"3524" WText = nWidth - XText;\n"3525" }\n"3526" let BarTextLen = Math.floor((WText-2)/FontWidth);\n"3527"\n"3528" if(BarTextLen >= 2)\n"3529" {\n"3530" let TimeText = TimeToMsString(Duration);\n"3531" let TimeTextLen = TimeText.length;\n"3532" if(BarTextLen < NameLen)\n"3533" Name = Name.substr(0, BarTextLen);\n"3534" let YPos = Y+BoxHeight-FontAscent;\n"3535" BTxt.push(Name);\n"3536" BTxtPos.push(XText+2);\n"3537"\n"3538" BTxtPos.push(YPos);\n"3539" DebugDrawTextCount++;\n"3540" if(BarTextLen - NameLen > TimeTextLen)\n"3541" {\n"3542" BTxt.push(TimeText);\n"3543" BTxtPos.push(XText+WText-2 - TimeTextLen * FontWidth);\n"3544" BTxtPos.push(YPos);\n"3545" DebugDrawTextCount++;\n"3546" }\n"3547" }\n"3548" };\n"3549" {\n"3550" let Times = Timeline.Times;\n"3551" let Colors = Timeline.Colors;\n"3552" let Ends = Timeline.Ends;\n"3553" let Positions = Timeline.Positions;\n"3554" let Names = Timeline.Names;\n"3555" let SearchMatch = Timeline.SearchMatch;\n"3556" let off = 0.7;\n"3557" let off2 = 2*off;\n"3558" let MaxPosition = 1;\n"3559" if(Timeline.Positions.length)\n"3560" {\n"3561" fOffsetY = DrawDetailedViewLargeHeader(context, \"Timeline\", fOffsetY);\n"3562" }\n"3563"\n"3564" for(let i = 0; i < Timeline.Positions.length; ++i)\n"3565" {\n"3566" let TimeStart = Times[i];\n"3567" let TimeEnd = Ends[i];\n"3568" let Position = Positions[i];\n"3569" if(Position >= 0)\n"3570" {\n"3571" MaxPosition = Math.max(Position, MaxPosition);\n"3572" let Color = Colors[i];\n"3573" let Name = Names[i];\n"3574" let P = Positions[i];\n"3575" let X = (TimeStart - Off) * fScaleX;\n"3576" let Y = fOffsetY + P * (BoxHeight+2);\n"3577" let W = (TimeEnd-TimeStart)*fScaleX;\n"3578" if(FilterInputSearchActive2)\n"3579" {\n"3580" Color = SearchMatch[i] ? CIDMatch : CIDFail;\n"3581" }\n"3582" if(!bSecond)\n"3583" {\n"3584" if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y)\n"3585" {\n"3586" RangeCpuNext.Off = 0;\n"3587" RangeCpuNext.Begin = TimeStart;\n"3588" RangeCpuNext.End = TimeEnd;\n"3589" RangeCpuNext.Thread = -1;\n"3590" nHoverColorIndex = Color;\n"3591" Color = cidhovercolor;\n"3592" }\n"3593" AddBatch(0, Color, X, Y, W, Name, Name.length, TimeEnd-TimeStart);\n"3594" }\n"3595" }\n"3596" }\n"3597" fOffsetY += (1+MaxPosition) * (BoxHeight+3);\n"3598" }\n"3599" let nMinTimeMs = MinWidth / fScaleX;\n"3600" let AutoHideCount = 0;\n"3601" let VisibleThreadCount = 0;\n"3602" let DrawGuides = 1;\n"3603" let CurrentHeading;\n"3604" {\n"3605" if(!ThreadYBegin)\n"3606" {\n"3607" ThreadYBegin = Array(S0.ThreadNames.length);\n"3608" ThreadYEnd = Array(S0.ThreadNames.length);\n"3609" }\n"3610"\n"3611" for(let i = 0; i < nNumLogs; i++)\n"3612" {\n"3613" let nLog = ThreadOrderT[i];\n"3614" let ThreadName = S0.ThreadNames[nLog];\n"3615" let LogIsGPU = S0.ISGPU[nLog];\n"3616" let HeadingString = LogIsGPU ? \"GPU\" : \"CPU\";\n"3617" let Active = IsThreadActive(ThreadName) && 0 == S.ThreadLogAutoHidden[nLog];\n"3618" let ThreadColors = S0.ThreadColors[nLog];\n"3619" if(HeadingString != CurrentHeading)\n"3620" {\n"3621" fOffsetY = DrawDetailedViewLargeHeader(context, HeadingString, fOffsetY);\n"3622" CurrentHeading = HeadingString;\n"3623" }\n"3624"\n"3625"\n"3626" if(0 != S.ThreadLogAutoHidden[nLog] && HideMode == HideModeFullyHidden)\n"3627" {\n"3628" AutoHideCount++;\n"3629" continue;\n"3630" }\n"3631" if(HideMode == HideModeFullyHidden && !Active)\n"3632" {\n"3633" AutoHideCount++;\n"3634" continue;\n"3635" }\n"3636" VisibleThreadCount++;\n"3637" let SMul = 2;\n"3638" let LogHeight = (S0.MaxStack[nLog]) * BoxHeightScaledPos + BoxHeight;\n"3639" let LogHeight2 = (S0.MaxStack2[nLog]) * BoxHeightScaledPos + BoxHeight;\n"3640" if(nContextSwitchEnabled)\n"3641" {\n"3642" LogHeight += (CSwitchHeight+4);\n"3643" LogHeight2 += (CSwitchHeight+4);\n"3644" }\n"3645" if(!S0.SecondActive)\n"3646" {\n"3647" LogHeight2 = 0;\n"3648" }\n"3649" let OY = fOffsetY;\n"3650" if(!bSecond)\n"3651" {\n"3652" OY += LogHeight2+1;\n"3653" }\n"3654" else\n"3655" {\n"3656" if(DrawDetailedCompareReverse)\n"3657" {\n"3658" OY += LogHeight2 - 5;\n"3659" }\n"3660" }\n"3661"\n"3662" let fOffsetYDelta = Active ? (LogHeight + LogHeight2 + Padding) : BoxHeight;\n"3663"\n"3664" ThreadYBegin[nLog] = fOffsetY;\n"3665" ThreadYEnd[nLog] = fOffsetY + fOffsetYDelta;\n"3666"\n"3667" let ThreadHover = false;\n"3668" if(bDrawEnabled)\n"3669" {\n"3670" if(Active || !bSecond)\n"3671" {\n"3672" let Color = bSecond ? ThreadColors.coloroff : ThreadColors.color;\n"3673" let ColorLine = !bSecond ? ThreadColors.colordark : ThreadColors.color;\n"3674" let BaseY = (bSecond||!Active) ? (fOffsetY+1) : (fOffsetY+1+LogHeight2);\n"3675" let HeightY = !Active ? BoxHeight : (bSecond ? LogHeight2 : (LogHeight + Padding));\n"3676" let TransparentLine = S2.Frames != null && !bSecond;\n"3677" if(TransparentLine)\n"3678" {\n"3679" context.globalAlpha = 0.4;\n"3680" }\n"3681" context.strokeStyle = ColorLine;\n"3682" context.beginPath();\n"3683" context.moveTo(0, BaseY+HeightY-1);\n"3684" context.lineTo(nWidth, BaseY+HeightY-1);\n"3685" context.stroke();\n"3686" if(TransparentLine)\n"3687" {\n"3688" context.globalAlpha = 1.0;\n"3689" }\n"3690" let Gradient = context.createLinearGradient(0,BaseY,0,40 + BaseY);\n"3691" Gradient.addColorStop(0, ThreadColors.colortrans);\n"3692" Gradient.addColorStop(1,\'transparent\');\n"3693" if(bSecond)\n"3694" ThreadColors.gradientoff = Gradient;\n"3695" else\n"3696" ThreadColors.gradient = Gradient;\n"3697" context.fillStyle = Gradient;\n"3698" context.fillRect(0,BaseY,nWidth,HeightY);\n"3699" }\n"3700" }\n"3701" let D = fOffsetY + BoxHeight - DetailedViewMouseY;\n"3702"\n"3703" if(!bSecond)\n"3704" {\n"3705" if(D > 0 && D < BoxHeight)\n"3706" {\n"3707" if(!bDrawEnabled)\n"3708" {\n"3709" context.globalAlpha = 0.3;\n"3710" context.fillStyle = \'grey\';\n"3711" context.fillRect(0, fOffsetY+2, nWidth, Active ? LogHeight2 + LogHeight + Padding : BoxHeight);\n"3712" context.globalAlpha = 1.0;\n"3713" }\n"3714" ThreadHover = 1;\n"3715" }\n"3716" }\n"3717" let HasSetHover = 0;\n"3718"\n"3719"\n"3720" if(Active)\n"3721" {\n"3722" if(DrawDetailedNewDraw)\n"3723" {\n"3724" OY += 4;\n"3725"\n"3726" if(nContextSwitchEnabled)\n"3727" {\n"3728" DrawContextSwitchBars(context, S.ThreadIds[nLog], fScaleX, OY, Off, nHoverColor, MinWidth, bDrawEnabled, bSecond);\n"3729" OY += Scale * (CSwitchHeight+2);\n"3730" }\n"3731" OY += SecondReverseOffset;\n"3732" // Duration of 1 pixel\n"3733" let ThresholdPixelDuration = fDetailedRange / nWidth;\n"3734" let ThresholdLimit = ThresholdPixelDuration * 1.0; // if below this we dont go further down\n"3735" let Rows = S.LogRows[nLog];\n"3736" for(let r in Rows)\n"3737" {\n"3738" {\n"3739" let Row = Rows[r];\n"3740" let Size = Row.Tree.length;\n"3741" let Tree = Row.Tree;\n"3742" const Y = OY + r * BoxHeightScaled;\n"3743" const MY = DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y;\n"3744"\n"3745"\n"3746" let DrawRange = function(Depth, Begin, End)\n"3747" {\n"3748" let TreeLevel = Tree[Depth];\n"3749" for(let j = Begin; j < End; ++j)\n"3750" {\n"3751" let TimeBegin = TreeLevel.Begin[j];\n"3752" let Duration = TreeLevel.Duration[j];\n"3753" let TimeEnd = TimeBegin + Duration;\n"3754" if(TimeBegin < fTimeEnd && TimeEnd > Off)\n"3755" {\n"3756"\n"3757" if(Depth > 0 && TreeLevel.Duration[j] > ThresholdLimit)\n"3758" {\n"3759" DrawRange(Depth-1, j*2, j*2 + 2);\n"3760" }\n"3761" else\n"3762" {\n"3763" let Index = TreeLevel.Index[j];\n"3764" let cid = TreeLevel.ColorIds[j];\n"3765" let Opacity = Depth == 0 ? 1.0 : TreeLevel.SumDuration[j] / TreeLevel.Duration[j];\n"3766"\n"3767" if(FilterInputSearchActive2)\n"3768" {\n"3769" if(Depth == 0)\n"3770" cid = S0.TimerInfo[Index].search;\n"3771" else\n"3772" cid = CIDFail;\n"3773" }\n"3774" else\n"3775" {\n"3776" if(GroupColors == 1 && Depth == 0)\n"3777" cid = S0.TimerInfo[Index].cid;\n"3778" if(GroupColors == 2)\n"3779" cid = ThreadColors.colordark_cid;\n"3780" if(GroupColors == 3)\n"3781" cid = TreeLevel.SectionColor[j];\n"3782" }\n"3783" if(Index == nHoverToken)\n"3784" {\n"3785" nHoverColorIndex = cid;\n"3786" cid = cidhovercolor;\n"3787" }\n"3788"\n"3789"\n"3790" let Name = Depth == 0 ? S0.TimerInfo[Index].name : \"\";\n"3791" let NameLen = Depth == 0 ? S0.TimerInfo[Index].len : 0;\n"3792" let X = (TimeBegin - Off) * fScaleX;\n"3793" let W = (TimeEnd-TimeBegin)*fScaleX;\n"3794" if(W > 1 || Opacity > 0.1)\n"3795" {\n"3796" AddBatch(Depth, cid, X, Y, W, Name, NameLen, TimeEnd-TimeBegin, Opacity);\n"3797" }\n"3798"\n"3799" const M = MY && DetailedViewMouseX >= X && DetailedViewMouseX <= X+W;\n"3800" if(Depth == 0 && M)\n"3801" {\n"3802" RangeCpuNext.Off = bSecond ? fDetailedOffsetSecond : 0;\n"3803" RangeCpuNext.Begin = TimeBegin;\n"3804" RangeCpuNext.End = TimeEnd;\n"3805" RangeCpuNext.Thread = nLog;\n"3806" RangeCpuNext.Off = XOffset;\n"3807" if(TreeLevel.CpuDuration && TreeLevel.CpuDuration[j]) // detect if its a gpu marker, with embedded cpu ticks.\n"3808" {\n"3809" RangeGpuNext.Begin = RangeCpuNext.Begin;\n"3810" RangeGpuNext.End = RangeCpuNext.End;\n"3811" RangeGpuNext.Thread = nLog;\n"3812" RangeGpuNext.Off = XOffset;\n"3813"\n"3814" RangeCpuNext.Begin = TreeLevel.CpuBegin[j];\n"3815" RangeCpuNext.End = TreeLevel.CpuBegin[j] + TreeLevel.CpuDuration[j];\n"3816" RangeCpuNext.Thread = TreeLevel.CpuThread[j];\n"3817" RangeCpuNext.Off = XOffset;\n"3818" }\n"3819" else\n"3820" {\n"3821" RangeGpuNext.Begin = -1;\n"3822" RangeGpuNext.End = -1\n"3823" }\n"3824" nHoverTokenNext = Index;\n"3825" nHoverTokenStack = r;\n"3826" nHoverTokenIndexNext = TreeLevel.Source[j];\n"3827" nHoverTokenLogIndexNext = nLog;\n"3828" HoverTokenNextOwner = S;\n"3829" HasSetHover = 1;\n"3830"\n"3831"\n"3832" if(Index == FilterSearchPassIndex)\n"3833" {\n"3834" console.log(\"kill this\");\n"3835" let Range = RangeInit();\n"3836" Range.Begin = TimeBegin;\n"3837" Range.End = TimeEnd;\n"3838" Range.Thread = nLog;\n"3839" Range.YBegin = Y - ThreadYBegin[nLog];\n"3840" Range.Second = bSecond;\n"3841"\n"3842" if(FilterSearchArray.length < 500)\n"3843" {\n"3844" FilterSearchArray.push(Range);\n"3845" if(FilterSearchArray.length == 500)\n"3846" {\n"3847" ShowFlashMessage(\'Capping Search Result to 500\', 30);\n"3848" }\n"3849" }\n"3850" }\n"3851"\n"3852"\n"3853"\n"3854" }\n"3855" }\n"3856" }\n"3857" }\n"3858" }\n"3859" DrawRange(Size-1, 0, Tree[Size-1].Length);\n"3860" // if tree is uneven, the tails won\'t have parents.\n"3861" for(let i = Size-2; i >= 0; --i)\n"3862" {\n"3863" let TreeLen = Tree[i].Length;\n"3864" if((TreeLen % 2) == 1)\n"3865" DrawRange(i, TreeLen-1, TreeLen);\n"3866" }\n"3867"\n"3868" }\n"3869" }\n"3870" }\n"3871" else\n"3872" {\n"3873"\n"3874" let LodIndex = 0;\n"3875" let MinDelta = 0;\n"3876" let NextLod = 1;\n"3877" while(NextLod < S.LodData.length && S.LodData[NextLod].MinDelta[nLog] < nMinTimeMs)\n"3878" {\n"3879" LodIndex = NextLod;\n"3880" NextLod = NextLod + 1;\n"3881" MinDelta = S.LodData[LodIndex].MinDelta[nLog];\n"3882" }\n"3883" if(LodIndex == S.LodData.length)\n"3884" {\n"3885" LodIndex = S.LodData.length-1;\n"3886" }\n"3887" if(DisableLod || FilterSearchPassIndex != -1)\n"3888" {\n"3889" LodIndex = 0;\n"3890" }\n"3891"\n"3892" OY += 4;\n"3893"\n"3894" if(nContextSwitchEnabled)\n"3895" {\n"3896" DrawContextSwitchBars(context, S.ThreadIds[nLog], fScaleX, OY, Off, nHoverColor, MinWidth, bDrawEnabled, bSecond);\n"3897" OY += Scale * (CSwitchHeight+2);\n"3898" }\n"3899" OY += SecondReverseOffset;\n"3900" let MaxDepth = 1;\n"3901" let StackPos = 0;\n"3902" let Stack = Array(20);\n"3903" let Lod = S.LodData[LodIndex];\n"3904"\n"3905" let TypeArray = Lod.TypeArray[nLog];\n"3906" let IndexArray = Lod.IndexArray[nLog];\n"3907" let TimeArray = Lod.TimeArray[nLog];\n"3908"\n"3909" let LocalFirstFrame = S.Frames[FirstFrame].FirstFrameIndex[nLog];\n"3910" let IndexStart = S.ISGPU[nLog] ? 0 : Lod.LogStart[LocalFirstFrame][nLog];\n"3911" let IndexEnd = TimeArray.length;\n"3912" IndexEnd = TimeArray.length;\n"3913"\n"3914"\n"3915"\n"3916" for(let j = IndexStart; j < IndexEnd; ++j)\n"3917" {\n"3918" let type = TypeArray[j];\n"3919" let index = IndexArray[j];\n"3920" let time = TimeArray[j];\n"3921" if(type == 1)\n"3922" {\n"3923" //push\n"3924" Stack[StackPos] = j;\n"3925" StackPos++;\n"3926" if(StackPos > MaxDepth)\n"3927" {\n"3928" MaxDepth = StackPos;\n"3929" }\n"3930" }\n"3931" else if(type == 0)\n"3932" {\n"3933" if(StackPos>0)\n"3934" {\n"3935" StackPos--;\n"3936"\n"3937" let StartIndex = Stack[StackPos];\n"3938" let timestart = TimeArray[StartIndex];\n"3939" let timeend = time;\n"3940" let X = (timestart - Off) * fScaleX;\n"3941" let Y = OY + StackPos * BoxHeightScaled;\n"3942"\n"3943" let W = (timeend-timestart)*fScaleX;\n"3944"\n"3945" if(X < nWidth && X+W > 0)\n"3946" {\n"3947" if(index == FilterSearchPassIndex)\n"3948" {\n"3949" let Range = RangeInit();\n"3950" Range.Begin = timestart;\n"3951" Range.End = timeend;\n"3952" Range.Thread = nLog;\n"3953" Range.YBegin = Y - ThreadYBegin[nLog];\n"3954" Range.Second = bSecond;\n"3955"\n"3956" if(FilterSearchArray.length < 500)\n"3957" {\n"3958" FilterSearchArray.push(Range);\n"3959" if(FilterSearchArray.length == 500)\n"3960" {\n"3961" ShowFlashMessage(\'Capping Search Result to 500\', 30);\n"3962" }\n"3963" }\n"3964" }\n"3965" if(W > MinWidth)\n"3966" {\n"3967" if(bDrawEnabled || index == nHoverToken)\n"3968" {\n"3969" let cid = GroupColors == 2 ? ThreadColors.colordark_cid : S0.TimerInfo[index].cid;\n"3970" if(index == nHoverToken)\n"3971" {\n"3972" nHoverColorIndex = cid;\n"3973" cid = cidhovercolor;\n"3974" }\n"3975" AddBatch(StackPos, cid, X, Y, W, S0.TimerInfo[index].name, S0.TimerInfo[index].len, timeend-timestart);\n"3976" }\n"3977"\n"3978"\n"3979" if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y && StackPos > nHoverTokenStack)\n"3980" {\n"3981" RangeCpuNext.Off = bSecond ? fDetailedOffsetSecond : 0;\n"3982" RangeCpuNext.Begin = timestart;\n"3983" RangeCpuNext.End = timeend;\n"3984" RangeCpuNext.Thread = nLog;\n"3985" RangeCpuNext.Off = XOffset;\n"3986" if((TypeArray[StartIndex+1]&3) == 3 && (TypeArray[j+1]&3) == 3)\n"3987" {\n"3988" RangeGpuNext.Begin = RangeCpuNext.Begin;\n"3989" RangeGpuNext.End = RangeCpuNext.End;\n"3990" RangeGpuNext.Thread = nLog;\n"3991" RangeGpuNext.Off = XOffset;\n"3992" //cpu tick is stored following\n"3993" RangeCpuNext.Begin = TimeArray[StartIndex+1];\n"3994" RangeCpuNext.End = TimeArray[j+1];\n"3995" RangeCpuNext.Thread = IndexArray[StartIndex+1];\n"3996" RangeCpuNext.Off = XOffset;\n"3997" }\n"3998" else\n"3999" {\n"4000" RangeGpuNext.Begin = -1;\n"4001" RangeGpuNext.End = -1\n"4002" }\n"4003"\n"4004" nHoverTokenNext = index;\n"4005" nHoverTokenStack = StackPos;\n"4006" nHoverTokenIndexNext = j;\n"4007" nHoverTokenLogIndexNext = nLog;\n"4008" HoverTokenNextOwner = S;\n"4009" HasSetHover = 1;\n"4010" }\n"4011" }\n"4012" }\n"4013" if(StackPos == 0 && time > fTimeEnd)\n"4014" break;\n"4015" }\n"4016" }\n"4017" }\n"4018" // if(HasSetHover)\n"4019" // {\n"4020" // for(let i = 0; i < S.Frames.length-1; ++i)\n"4021" // {\n"4022" // let IndexStart = Lod.LogStart[i][nLog];\n"4023" // if(nHoverTokenIndexNext >= IndexStart)\n"4024" // {\n"4025" // nHoverFrame = i;\n"4026" // }\n"4027" // }\n"4028" // }\n"4029" }\n"4030" }\n"4031" let w = context.measureText(ThreadName).width;\n"4032" context.fillStyle = nBackColors[0];\n"4033" context.fillStyle = \'white\';\n"4034" context.fillText(ThreadName, 0, fOffsetY+FontHeight-1);\n"4035" if(ThreadHover)\n"4036" {\n"4037" DrawDetailedButtons(context, nWidth, fOffsetY+1, [\"\\u2191\\u2191\\u2191\", \"\\u2193\\u2193\\u2193\", \"\\u2191\", \"\\u2193\"],\n"4038" [function(){ThreadOrderMoveUp(ThreadName,1);}, function(){ThreadOrderMoveDown(ThreadName,1);},\n"4039" function(){ThreadOrderMoveUp(ThreadName);}, function(){ThreadOrderMoveDown(ThreadName);}],\n"4040" \"right\");\n"4041" // DetailedAddMouseEvent(1, function(){ Callbacks[i](); } );\n"4042" DetailedAddMouseEvent(1, function()\n"4043" {\n"4044" ToggleThread(ThreadName);\n"4045" });\n"4046" }\n"4047" // context.textBaseline = \'alphabetic\';\n"4048" fOffsetY += fOffsetYDelta;\n"4049" // ThreadY[nLog+1] = fOffsetY;\n"4050" }\n"4051" if(AutoHideCount)\n"4052" {\n"4053" fOffsetY += FontHeight;\n"4054" let Text = AutoHideCount + \" Threads Auto Hidden. Toggle in Thread Menu to show\";\n"4055" let w = context.measureText(Text).width;\n"4056" context.fillStyle = \"orange\";\n"4057" context.fillText(Text, 0, fOffsetY+FontHeight-1);\n"4058" }\n"4059" if(VisibleThreadCount == 0 && HideMode == HideModeFullyHidden)\n"4060" {\n"4061" fOffsetY += FontHeight;\n"4062" let Text = \"All Threads Hidden. Toggle in Thread Menu to show\";\n"4063" let w = context.measureText(Text).width;\n"4064" context.fillStyle = \"red\";\n"4065" context.fillText(Text, 0, fOffsetY+FontHeight-1);\n"4066" }\n"4067"\n"4068" if(nContextSwitchEnabled && !bSecond) //non instrumented threads.\n"4069" {\n"4070" let CurrentPid = -112;\n"4071" let ContextSwitchThreads = S.CSwitchOnlyThreads;\n"4072" function DrawHeader(str, X, Y)\n"4073" {\n"4074" let width = str.length * FontWidth;\n"4075" context.globalAlpha = 0.5;\n"4076" context.fillStyle = \'grey\';\n"4077" context.fillRect(X, Y-FontHeight + 2, width, FontHeight);\n"4078" context.globalAlpha = 1.0;\n"4079" context.fillStyle = \'white\';\n"4080" context.fillText(str, X, Y);\n"4081"\n"4082"\n"4083" }\n"4084" for(let i = 0; i < ContextSwitchThreads.length; ++i)\n"4085" {\n"4086" let ThreadId = ContextSwitchThreads[i];\n"4087" let ThreadName = \'\' + ThreadId;\n"4088" let TI = S.CSwitchThreads[ThreadId];\n"4089"\n"4090" if(TI)\n"4091" {\n"4092" if(CurrentPid != TI.pid)\n"4093" {\n"4094" fOffsetY += BoxHeight + 1;\n"4095" CurrentPid = TI.pid;\n"4096" let str = TI.pid.toString(16) +\':\' +TI.p;\n"4097" DrawHeader(str, 0, fOffsetY+5);\n"4098" fOffsetY += BoxHeight + 1;\n"4099" }\n"4100" }\n"4101"\n"4102" DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, Off, nHoverColor, MinWidth, bDrawEnabled);\n"4103"\n"4104" if(TI)\n"4105" {\n"4106" DrawHeader(TI.tid.toString(16) +\':\' +TI.t, 10, fOffsetY+5);\n"4107" }\n"4108" fOffsetY += BoxHeight + 1;\n"4109" }\n"4110" }\n"4111" {\n"4112" let h = nHeight;\n"4113"\n"4114" }\n"4115" let TOP_LIMIT = 100;\n"4116" if(fOffsetY < TOP_LIMIT)\n"4117" {\n"4118" let Diff = fOffsetY - TOP_LIMIT;\n"4119" nOffsetY += Math.floor(Diff);\n"4120" nOffsetY = Math.max(0, nOffsetY);\n"4121" }\n"4122" let FillRects = function(a, color, colordark)\n"4123" {\n"4124" context.fillStyle = color;\n"4125" let opac = -1;\n"4126" for(let j = 0; j < a.length; j += 4)\n"4127" {\n"4128" let X = a[j];\n"4129" let Y = a[j+1];\n"4130" let W = a[j+2];\n"4131" let O = a[j+3];\n"4132" if(O != opac)\n"4133" {\n"4134" opac = O;\n"4135" context.globalAlpha = opac;\n"4136" }\n"4137" context.fillRect(X, Y, W, BoxHeight-1);\n"4138" }\n"4139" };\n"4140" let rect_calls = 0;\n"4141" let text_calls = 0;\n"4142"\n"4143" {\n"4144" let Batches = BatchData.Batches;\n"4145" for(let i = 0; i < Batches.length; ++i)\n"4146" {\n"4147" let a = Batches[i];\n"4148" if(a.length)\n"4149" {\n"4150" let Color = i == 0 ? nHoverColor : g_Colors[i];\n"4151" let ColorDark = i == 0 ? nHoverColor : g_ColorsDark[i];\n"4152" if(i == 0)\n"4153" {\n"4154" if(nHoverColorIndex)\n"4155" {\n"4156" let mult = nHoverCounter / 255.0;\n"4157" let m2 =mult -0.5;\n"4158" let m4 = m2 * 0.5;\n"4159" let f = function()\n"4160" {\n"4161" let H = g_ColorH[nHoverColorIndex];\n"4162" let S = g_ColorS[nHoverColorIndex];\n"4163" let L = g_ColorL[nHoverColorIndex];\n"4164" let offset = 0;\n"4165" if(S> 0.5)\n"4166" offset = 0.5 - S;\n"4167" let offsetL = 0;\n"4168" if(L > 0.75)\n"4169" offsetL = 0.75 - L;\n"4170" L = L + m4 + offsetL;\n"4171" L = L > 1 ? 1 : (L < 0 ? 0 : L);\n"4172" S = S + m2 + offset;\n"4173" S = S > 1 ? 1 : (S < 0 ? 0 : S);\n"4174" return ConvertHslToColor(H, S, L);\n"4175" };\n"4176" let ColorCV = f();\n"4177" ColorDark = Color = ColorCV; ;\n"4178" }\n"4179" }\n"4180" FillRects(a, Color, ColorDark);\n"4181" rect_calls += a.length;\n"4182"\n"4183" }\n"4184" }\n"4185" context.globalAlpha = 1.0;\n"4186" let BatchesTxt = BatchData.BatchesTxt;\n"4187" let BatchesTxtPos = BatchData.BatchesTxtPos;\n"4188" for(let i = 0; i < BatchesTxt.length; ++i)\n"4189" {\n"4190" context.fillStyle = BatchesTxtColor[i];\n"4191" let TxtArray = BatchesTxt[i];\n"4192" let PosArray = BatchesTxtPos[i];\n"4193" for(let j = 0; j < TxtArray.length; ++j)\n"4194" {\n"4195" let k = j * 2;\n"4196" context.fillText(TxtArray[j], PosArray[k],PosArray[k+1]);\n"4197"\n"4198" }\n"4199" text_calls += TxtArray.length;\n"4200" }\n"4201"\n"4202" }\n"4203" // console.log(\"rect_calls \", rect_calls, \" text_calls \", text_calls);\n"4204"\n"4205" }\n"4206"// console.log(\"Total Batches \", TotalBatches);\n"4207"\n"4208"}\n"4209"\n"4210"\n"4211"function DrawTextBox(context, text, x, y, align)\n"4212"{\n"4213" let textsize = context.measureText(text).width;\n"4214" let offsetx = 0;\n"4215" let offsety = -FontHeight;\n"4216" if(align == \'center\')\n"4217" {\n"4218" offsetx = -textsize / 2.0;\n"4219" }\n"4220" else if(align == \'right\')\n"4221" {\n"4222" offsetx = -textsize;\n"4223" }\n"4224" context.fillStyle = nBackColors[0];\n"4225" context.fillRect(x + offsetx, y + offsety, textsize+2, FontHeight + 2);\n"4226" context.fillStyle = \'white\';\n"4227" context.fillText(text, x, y);\n"4228"\n"4229"}\n"4230"\n"4231"function DrawFilterSearchRanges(context, Ranges, ColorBack, ColorFront, ThreadY)\n"4232"{\n"4233" if(0 == Ranges.length)\n"4234" return;\n"4235" //todo: arrow key support\n"4236" var MarginTop = 1.0 * FontHeight;\n"4237" var MarginBottom = nHeight - 1.0 * FontHeight;\n"4238"\n"4239"\n"4240" var Time = new Date();\n"4241" var Delta = Time - FilterSearchStartTime;\n"4242" var BlinkTime = 2.5 * 1000;\n"4243" var Blinks = 5;\n"4244" var HoverFloat = 0.2;\n"4245" var Blinking = 0;\n"4246" if(Delta < BlinkTime)\n"4247" {\n"4248" Blinking = 1;\n"4249" var b0 = Blinks* Math.PI * Delta;\n"4250" var b1 = b0 / BlinkTime;\n"4251" var Mag = Math.abs(Math.sin(b1));\n"4252" HoverFloat = ";42534254const size_t g_MicroProfileHtml_end_2_size = sizeof(g_MicroProfileHtml_end_2);4255const char g_MicroProfileHtml_end_3[] =4256"Mag * 0.5 + 0.2;\n"4257" }\n"4258" var Lines = new Array();\n"4259" var Rects = new Array();\n"4260"\n"4261"\n"4262" for(var i = 0; i < Ranges.length; ++i)\n"4263" {\n"4264" var Range = Ranges[i];\n"4265" let Off = Range.Second ? fDetailedOffsetSecond : 0\n"4266" var fBegin = Range.Begin - Off;\n"4267" var fEnd = Range.End - Off;\n"4268" var OffsetTop = Range.YBegin + ThreadY[Range.Thread];\n"4269" var OffsetBottom = OffsetTop + BoxHeight;\n"4270"\n"4271" if(fBegin < fEnd)\n"4272" {\n"4273" {\n"4274" OffsetTop = Math.max(OffsetTop, 0);\n"4275" OffsetBottom = Math.max(OffsetBottom, MarginTop);\n"4276" OffsetTop = Math.min(OffsetTop, MarginBottom);\n"4277" OffsetBottom = Math.min(OffsetBottom, nHeight);\n"4278" var fScaleX = nWidth / fDetailedRange;\n"4279" var X = (fBegin - fDetailedOffset) * fScaleX;\n"4280" var Y = OffsetTop;\n"4281" var W = (fEnd - fBegin) * fScaleX;\n"4282" if(W > 1)\n"4283" {\n"4284" Rects.push(X-3);\n"4285" Rects.push(OffsetTop-3);\n"4286" Rects.push(W+5);\n"4287" Rects.push(5 + OffsetBottom - OffsetTop);\n"4288" }\n"4289" else\n"4290" {\n"4291" X += W * 0.5;\n"4292" Lines.push(X);\n"4293" context.beginPath();\n"4294" context.moveTo(X, 0);\n"4295" context.lineTo(X, nHeight);\n"4296" context.stroke();\n"4297" }\n"4298" }\n"4299" }\n"4300" }\n"4301"\n"4302" context.fillStyle = ColorBack;\n"4303" context.strokeStyle = ColorBack;\n"4304"\n"4305" context.globalAlpha = HoverFloat;\n"4306"\n"4307" for(var i = 0; i < Rects.length;)\n"4308" {\n"4309" var X = Rects[i++];\n"4310" var Y = Rects[i++];\n"4311" var W = Rects[i++];\n"4312" var H = Rects[i++];\n"4313" context.fillRect(X, Y, W, H);\n"4314" }\n"4315" context.globalAlpha = 1;\n"4316" for(var i = 0; i < Rects.length;)\n"4317" {\n"4318" var X = Rects[i++];\n"4319" var Y = Rects[i++];\n"4320" var W = Rects[i++];\n"4321" var H = Rects[i++];\n"4322" context.strokeRect(X, Y, W, H);\n"4323" }\n"4324"\n"4325" for(var i = 0; i < Lines.length; ++i)\n"4326" {\n"4327" context.beginPath();\n"4328" context.moveTo(Lines[i], 0);\n"4329" context.lineTo(Lines[i], nHeight);\n"4330" context.stroke();\n"4331" }\n"4332" if(Blinking>0)\n"4333" {\n"4334" Invalidate = 1;\n"4335" }\n"4336"\n"4337"}\n"4338"\n"4339"\n"4340"function DrawRange(context, Range, ColorBack, ColorFront, Name, Offset)\n"4341"{\n"4342" if(!Offset)\n"4343" Offset = 0;\n"4344"\n"4345" let XOffset = Range.Second ? fDetailedOffsetSecond : 0;\n"4346" let fBegin = Range.Begin - XOffset;\n"4347" let fEnd = Range.End - XOffset;\n"4348" let OffsetTop = Range.YBegin;\n"4349" let OffsetBottom = Range.YEnd;\n"4350" let Off = Range.Off + fDetailedOffset;\n"4351" if(fBegin < fEnd)\n"4352" {\n"4353" let MarginTop = (1.0+Offset) * (FontHeight+1);\n"4354" let MarginBottom = nHeight - (Offset+1.5) * (FontHeight+1);\n"4355" if(OffsetTop < MarginTop)\n"4356" {\n"4357" Offset += 1;\n"4358" OffsetTop = MarginTop;\n"4359" }\n"4360" if(OffsetBottom > MarginBottom)\n"4361" {\n"4362" OffsetBottom = MarginBottom;\n"4363" }\n"4364" let fRulerOffset = FontHeight * 0.5;\n"4365" let fScaleX = nWidth / fDetailedRange;\n"4366" let X = (fBegin - Off) * fScaleX;\n"4367" let YSpace = (FontHeight+2);\n"4368" let Y = OffsetTop;\n"4369" let YBottom = OffsetBottom;\n"4370" let W = (fEnd - fBegin) * fScaleX;\n"4371" context.globalAlpha = 0.1;\n"4372" context.fillStyle = ColorBack;\n"4373" context.fillRect(X, OffsetTop + fRulerOffset, W, OffsetBottom - OffsetTop);\n"4374" context.globalAlpha = 1;\n"4375" context.strokeStyle = ColorFront;\n"4376" context.beginPath();\n"4377" context.moveTo(X, 0);\n"4378" context.lineTo(X, nHeight);\n"4379" context.moveTo(X+W, 0);\n"4380" context.lineTo(X+W, nHeight);\n"4381" context.stroke();\n"4382" let Duration = (fEnd - fBegin).toFixed(2) + \"ms\";\n"4383" let Center = ((fBegin + fEnd) / 2.0) - Off;\n"4384" let DurationWidth = context.measureText(Duration+ \" \").width;\n"4385"\n"4386" context.fillStyle = \'white\';\n"4387" context.textAlign = \'right\';\n"4388" let TextPosY = Y + YSpace;\n"4389" DrawTextBox(context, (fBegin-Range.Off).toFixed(2), X-3, TextPosY, \'right\');\n"4390" let YS = [Y, YBottom];\n"4391" for(let i = 0; i < YS.length; ++i)\n"4392" {\n"4393" let Y = YS[i];\n"4394" let Y0 = Y + fRulerOffset;\n"4395" let W0 = W - DurationWidth + FontWidth*1.5;\n"4396" if(W0 > 6)\n"4397" {\n"4398" context.textAlign = \'center\';\n"4399" DrawTextBox(context, Duration,Center * fScaleX, Y + YSpace, \'center\');\n"4400" W0 = W0 / 2.0;\n"4401" let X0 = X + W0;\n"4402" let X1 = X + W - W0;\n"4403" context.strokeStyle = ColorFront;\n"4404" context.beginPath();\n"4405" context.moveTo(X, Y0);\n"4406" context.lineTo(X0, Y0);\n"4407" context.moveTo(X0, Y0-2);\n"4408" context.lineTo(X0, Y0+2);\n"4409" context.moveTo(X1, Y0-2);\n"4410" context.lineTo(X1, Y0+2);\n"4411" context.moveTo(X1, Y0);\n"4412" context.lineTo(X + W, Y0);\n"4413" context.stroke();\n"4414" }\n"4415" else\n"4416" {\n"4417" if(i == 1)\n"4418" {\n"4419" context.textAlign = \'right\';\n"4420" DrawTextBox(context, Duration, X - 3, Y0, \'right\');\n"4421" context.textAlign = \'left\';\n"4422" DrawTextBox(context, Duration, X + W + 2, Y0, \'left\');\n"4423" }\n"4424" context.strokeStyle = ColorFront;\n"4425" context.beginPath();\n"4426" context.moveTo(X, Y0);\n"4427" context.lineTo(X+W, Y0);\n"4428" context.stroke();\n"4429" }\n"4430" }\n"4431" context.textAlign = \'left\';\n"4432" DrawTextBox(context, (fEnd-Range.Off).toFixed(2), X + W + 2, TextPosY, \'left\');\n"4433" DrawTextBox(context, Name, X + W + 2, OffsetTop + YSpace + FontHeight, \'left\');\n"4434" }\n"4435" return Offset;\n"4436"}\n"4437"function DetailedAddMouseEvent(P, E)\n"4438"{\n"4439" if(!DetailedMouseEvent)\n"4440" {\n"4441" DetailedMouseEvent = {\"P\":P, \"E\":E};\n"4442" }\n"4443" else if(DetailedMouseEvent.P < P)\n"4444" {\n"4445" DetailedMouseEvent.P = P;\n"4446" DetailedMouseEvent.E = E;\n"4447" }\n"4448"\n"4449"}\n"4450"\n"4451"function CreateGraphData(Samples, Name, Color)\n"4452"{\n"4453" let gd = {};\n"4454" gd.Samples = Samples;\n"4455" gd.Name = Name;\n"4456" gd.Color = Color;\n"4457" return gd;\n"4458"}\n"4459"\n"4460"function CreateDrawGraphParameters()\n"4461"{\n"4462" let P = {};\n"4463" P.Rect = WindowRect(0, 0, 1, 1);\n"4464" P.RangeMin = 0.0;\n"4465" P.RangeMax = 0.0;\n"4466" P.Mark = [16.66, 33.33];\n"4467" P.Ext = \"ms\";\n"4468" P.Border = 2;\n"4469" P.Frame = 1;\n"4470" return P;\n"4471"}\n"4472"\n"4473"\n"4474"\n"4475"function DrawGraph(context, Parameters, data, Mouse)\n"4476"{\n"4477"\n"4478" ProfileEnter(\"DrawGraph\");\n"4479" let Rect = Parameters.Rect;\n"4480" let RangeMin = Parameters.RangeMin;\n"4481" let RangeMax = Parameters.RangeMax;\n"4482" let MaxLen = 0;\n"4483" let MaxSample = 0;\n"4484" let MinSample = 1e25;\n"4485" for(let i in data)\n"4486" {\n"4487" let d = data[i];\n"4488" MaxLen = Math.max(MaxLen, d.Samples.length);\n"4489" for(let j in d.Samples)\n"4490" {\n"4491" MaxSample = Math.max(MaxSample, d.Samples[j]);\n"4492" MinSample = Math.max(MinSample, d.Samples[j]);\n"4493" }\n"4494" }\n"4495" if(0 == MaxLen)\n"4496" return;\n"4497"\n"4498" if(RangeMax <= RangeMin)\n"4499" {\n"4500" RangeMin = MinSample;\n"4501" RangeMax = MaxSample;\n"4502" }\n"4503"\n"4504"\n"4505" let Ext = Parameters.Ext;\n"4506" let Border = Parameters.Border;\n"4507" let Frame = Parameters.Frame;\n"4508" if(Frame)\n"4509" Border += 10;\n"4510"\n"4511" let wx = Rect.x;\n"4512" let wy = Rect.y;\n"4513" let wh = Rect.h;\n"4514" let ww = Rect.w;\n"4515"\n"4516" let x = Rect.x + Border;\n"4517" let y = Rect.y + Border;\n"4518" let h = Rect.h - 2*Border;\n"4519" let w = Rect.w - 2*Border;\n"4520"\n"4521" let MouseX = Mouse.X-x;\n"4522" let MouseY = Mouse.Y-y;\n"4523" let MouseInside = Mouse.X >= x && Mouse.Y >= y && Mouse.X < x + w && Mouse.Y < y + h;\n"4524" let MouseXPrc = (Mouse.X - x) / (w-1);\n"4525"\n"4526" context.clearRect(wx, wy, ww, wh);\n"4527"\n"4528"\n"4529" let SampleWidth = w / (MaxLen-1);\n"4530" let MouseIndex = Math.max(0, Math.min(MaxLen-1, Math.floor(MouseXPrc * MaxLen)));\n"4531"\n"4532" let HeightScale = h / (RangeMax-RangeMin);\n"4533" let Y = y + h;\n"4534" let YStart = Y;\n"4535"\n"4536" for(let dataindex in data)\n"4537" {\n"4538" let LocalElement = data[dataindex];\n"4539" let Samples = LocalElement.Samples;\n"4540" let X = x + w - (Samples.length-1)*SampleWidth;\n"4541" Y = y + h;\n"4542"\n"4543" context.globalAlpha = 1;\n"4544" context.strokeStyle = LocalElement.Color;\n"4545" context.fillStyle = LocalElement.Color;\n"4546" context.beginPath();\n"4547" for(let i = 0; i < Samples.length; ++i)\n"4548" {\n"4549" Y = Math.max(YStart - Samples[i] * HeightScale, y);\n"4550" if(i == 0)\n"4551" context.moveTo(X, Y);\n"4552" else\n"4553" context.lineTo(X, Y);\n"4554" X += SampleWidth;\n"4555"\n"4556" }\n"4557" let GRAPH_ALPHA = 0.2;\n"4558" context.stroke();\n"4559" context.lineTo(X-SampleWidth, YStart);\n"4560" context.lineTo(x, YStart);\n"4561" context.globalAlpha = GRAPH_ALPHA;\n"4562" context.fill();\n"4563"\n"4564" if(MouseInside)\n"4565" {\n"4566" let MouseSample = Samples[MouseIndex];\n"4567" let Y = Math.max(YStart - MouseSample * HeightScale, y);\n"4568" let X = x + w + (MouseIndex - (Samples.length-1))*SampleWidth;\n"4569"\n"4570" context.globalAlpha = 0.8;\n"4571" context.beginPath();\n"4572" context.arc(X, Y, 2, 0, 2 * Math.PI);\n"4573" context.fill();\n"4574"\n"4575" context.globalAlpha = 1;\n"4576"\n"4577" context.beginPath();\n"4578" context.arc(X, Y, 3, 0, 2 * Math.PI);\n"4579" context.stroke();\n"4580" }\n"4581"\n"4582"\n"4583" }\n"4584" context.globalAlpha = 1;\n"4585" context.fillStyle = \'wheat\';\n"4586" context.strokeStyle = \'wheat\';\n"4587" context.textAlign=\'right\';\n"4588" context.fillText(RangeMax + Ext, x+w, y + FontHeight);\n"4589" for(let m in Parameters.Mark)\n"4590" {\n"4591" let Sample = Parameters.Mark[m];\n"4592" let Y = YStart - Sample * HeightScale;\n"4593" context.fillText(Sample + Ext, x+w, Y + FontHeight);\n"4594" }\n"4595"\n"4596"\n"4597" context.globalAlpha = 0.4;\n"4598" for(let m in Parameters.Mark)\n"4599" {\n"4600" let Sample = Parameters.Mark[m];\n"4601" let Y = YStart - Sample * HeightScale;\n"4602" {\n"4603" context.beginPath();\n"4604" context.moveTo(x-(Frame?5:0), Y);\n"4605" context.lineTo(x+w, Y);\n"4606" context.stroke();\n"4607" }\n"4608" }\n"4609" context.globalAlpha = 1;\n"4610" if(Frame)\n"4611" {\n"4612" context.beginPath();\n"4613" context.moveTo(x-5, YStart);\n"4614" context.lineTo(x+w+5, YStart);\n"4615" context.stroke();\n"4616"\n"4617" context.beginPath();\n"4618" context.moveTo(x, YStart+5);\n"4619" context.lineTo(x, YStart-h-5);\n"4620" context.stroke();\n"4621"\n"4622" context.beginPath();\n"4623" context.moveTo(x, YStart-h);\n"4624" context.lineTo(x-5, YStart-h);\n"4625" context.stroke();\n"4626" }\n"4627"\n"4628" for(let dataindex = 0; dataindex < data.length; ++dataindex)\n"4629" {\n"4630" let LocalElement = data[dataindex];\n"4631" context.textAlign=\'left\';\n"4632" context.strokeStyle = LocalElement.Color;\n"4633" context.fillStyle = LocalElement.Color;\n"4634" context.fillText(LocalElement.Name, x+2, y + FontHeight * (dataindex+1));\n"4635" }\n"4636"\n"4637" if(MouseInside)\n"4638" {\n"4639" ToolTipImmediate = new Array();\n"4640" for(let dataindex in data)\n"4641" {\n"4642" let LocalElement = data[dataindex];\n"4643" let Samples = LocalElement.Samples;\n"4644" ToolTipImmediate.push(LocalElement.Name);\n"4645" ToolTipImmediate.push(FormatTime(Samples[MouseIndex])+ Parameters.Ext);\n"4646" }\n"4647" }\n"4648"\n"4649" ProfileLeave();\n"4650"}\n"4651"\n"4652"function DrawDetailed(Animation)\n"4653"{\n"4654" DetailedMouseEvent = null;\n"4655"\n"4656" if(!Initialized)\n"4657" {\n"4658" return;\n"4659" }\n"4660" ProfileEnter(\"DrawDetailed\");\n"4661" DetailedMouseOverButton = false;\n"4662"\n"4663" DebugDrawQuadCount = 0;\n"4664" DebugDrawTextCount = 0;\n"4665" nHoverCSCpuNext = -1;\n"4666"\n"4667" RangeCpuNext = RangeInit();\n"4668" RangeGpuNext = RangeInit();\n"4669"\n"4670" var start = new Date();\n"4671" nDrawCount++;\n"4672"\n"4673" var context = CanvasDetailedView.getContext(\'2d\');\n"4674" var offscreen = CanvasDetailedOffscreen.getContext(\'2d\');\n"4675" var fScaleX = nWidth / fDetailedRange;\n"4676" var fOffsetY = -nOffsetY + BoxHeight;\n"4677" if(DetailedRedrawState.fOffsetY == fOffsetY && DetailedRedrawState.fDetailedOffset == fDetailedOffset && DetailedRedrawState.fDetailedRange == fDetailedRange && !KeyCtrlDown && !KeyShiftDown && !KeyAltDown && !MouseDragButton && !RedrawRequested)\n"4678" {\n"4679" Invalidate++;\n"4680" }\n"4681" else\n"4682" {\n"4683" Invalidate = 0;\n"4684" DetailedRedrawState.fOffsetY = fOffsetY;\n"4685" DetailedRedrawState.fDetailedOffset = fDetailedOffset;\n"4686" DetailedRedrawState.fDetailedRange = fDetailedRange;\n"4687" }\n"4688" if(nHoverTokenDrawn != nHoverToken)\n"4689" {\n"4690" Invalidate = 1;\n"4691" }\n"4692" nHoverTokenDrawn = nHoverToken;\n"4693" nHoverTokenNext = -1;\n"4694" HoverTokenNextOwner = null;\n"4695" nHoverTokenLogIndexNext = -1;\n"4696" nHoverTokenIndexNext = -1;\n"4697"\n"4698"\n"4699"\n"4700" if(DrawDetailedNewDraw || Invalidate == 0) //when panning, only draw bars that are a certain width to keep decent framerate\n"4701" {\n"4702" context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"4703" DrawDetailedView(S, S, context, nMinWidthPan, true);\n"4704" DrawDetailedView(S2, S, context, nMinWidthPan, true, 1);\n"4705" ProfileRedraw0++;\n"4706" }\n"4707" else if(Invalidate == 1) //draw full and store\n"4708" {\n"4709" offscreen.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"4710" DrawDetailedView(S, S, offscreen, nMinWidth, true);\n"4711" DrawDetailedView(S2, S, offscreen, nMinWidth, true, 1);\n"4712" OffscreenData = offscreen.getImageData(0, 0, CanvasDetailedOffscreen.width, CanvasDetailedOffscreen.height);\n"4713" ProfileRedraw1++;\n"4714" }\n"4715" else//reuse stored result untill next time viewport is changed.\n"4716" {\n"4717" context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n"4718" context.putImageData(OffscreenData, 0, 0);\n"4719" DrawDetailedView(S, S, context, nMinWidth, false);\n"4720" DrawDetailedView(S2, S, context, nMinWidth, false, 1);\n"4721" ProfileRedraw2++;\n"4722" }\n"4723"\n"4724" if(KeyShiftDown || KeyCtrlDown || MouseDragSelectRange() || ZoomActive || FilterSearchActive)\n"4725" {\n"4726" nHoverToken = -1;\n"4727" nHoverTokenIndex = -1;\n"4728" nHoverTokenLogIndex = -1;\n"4729" HoverTokenOwner = null;\n"4730" RangeCpu = RangeInit();\n"4731" RangeGpu = RangeInit();\n"4732" }\n"4733" else\n"4734" {\n"4735" nHoverToken = nHoverTokenNext;\n"4736" HoverTokenOwner = HoverTokenNextOwner;\n"4737" nHoverTokenIndex = nHoverTokenIndexNext;\n"4738" nHoverTokenLogIndex = nHoverTokenLogIndexNext;\n"4739" if(RangeValid(RangeCpuHistory))\n"4740" {\n"4741" RangeCopy(RangeCpu, RangeCpuHistory);\n"4742" RangeCopy(RangeGpu, RangeGpuHistory);\n"4743" }\n"4744" else\n"4745" {\n"4746" RangeCopy(RangeCpu, RangeCpuNext);\n"4747" RangeCopy(RangeGpu, RangeGpuNext);\n"4748" }\n"4749" }\n"4750"\n"4751" DrawTextBox(context, TimeToMsString(fDetailedOffset), 0, FontHeight, \'left\');\n"4752" context.textAlign = \'right\';\n"4753" DrawTextBox(context, TimeToMsString(fDetailedOffset + fDetailedRange), nWidth, FontHeight, \'right\');\n"4754" context.textAlign = \'left\';\n"4755"\n"4756" if(!FilterSearchActive && !IgnoreInput && SubMenuActive == -1)\n"4757" {\n"4758" let Colors = GroupColors == 3 ? \"Color[Section]\" : (GroupColors == 2 ? \"Color[thread]\" : (GroupColors ? \"Color[group]\" : \"Color[timer]\"));\n"4759" DrawDetailedButtons(context, nWidth * 0.5, 0, [Colors],[function(){ToggleGroupColors(1);}], \"center\");\n"4760" }\n"4761"\n"4762"\n"4763" var YBegin = ThreadYBegin[fRangeThreadIdNext];\n"4764" var YEnd = ThreadYEnd[fRangeThreadIdNext];\n"4765" var YBeginGpu = YBegin;\n"4766" var YEndGpu = YEnd;\n"4767" function RangeSet(R)\n"4768" {\n"4769" if(R.Thread >= 0)\n"4770" {\n"4771" R.YBegin = ThreadYBegin[R.Thread];\n"4772" R.YEnd = ThreadYEnd[R.Thread];\n"4773" }\n"4774" else\n"4775" {\n"4776" R.YBegin = 0;\n"4777" R.YEnd = nHeight;\n"4778" }\n"4779" }\n"4780" RangeSet(RangeSelect);\n"4781" RangeSet(RangeCpu);\n"4782" RangeSet(RangeGpu);\n"4783" var Offset = 0;\n"4784" Offset = DrawRange(context, RangeSelect, \'#59d0ff\', \'#00ddff\', \"Selection\", Offset);\n"4785" Offset = DrawRange(context, RangeCpu, \'#009900\', \'#00ff00\', \"Cpu\", Offset);\n"4786" Offset = DrawRange(context, RangeGpu, \'#996600\', \'#775500\', \"Gpu\", Offset);\n"4787"\n"4788" DrawFilterSearchRanges(context, FilterSearchArray, \'#ff9900\', \'#ff9900\', ThreadYBegin);\n"4789"\n"4790" nHoverCSCpu = nHoverCSCpuNext;\n"4791"\n"4792" DrawFilterSearch();\n"4793"\n"4794" ProfileDrawFrameTimeGraph(context);\n"4795"\n"4796" ProfileLeave();\n"4797"}\n"4798"function ZoomToHighlight(NoGpu)\n"4799"{\n"4800" if(RangeValid(RangeGpu) && !NoGpu)\n"4801" {\n"4802" ZoomToRange(RangeGpu);\n"4803" }\n"4804" else if(RangeValid(RangeCpu))\n"4805" {\n"4806" ZoomToRange(RangeCpu);\n"4807" }\n"4808" RangeCpu = RangeInit();\n"4809" RangeGpu = RangeInit();\n"4810"}\n"4811"\n"4812"function MoveToNext(Direction) //1 forward, -1 backwards\n"4813"{\n"4814" let fTimeBegin, fTimeEnd, nLog;\n"4815" let Index = nHoverToken;\n"4816" let Source = S;\n"4817" let Offset = 0;\n"4818" if(RangeValid(RangeSelect))\n"4819" {\n"4820" fTimeBegin = RangeSelect.Begin;\n"4821" fTimeEnd = RangeSelect.End;\n"4822" nLog = RangeSelect.Thread;\n"4823" Index = RangeSelect.Index;\n"4824" if(RangeSelect.Second)\n"4825" {\n"4826" Source = S2;\n"4827" Offset = -fDetailedOffsetSecond;\n"4828" }\n"4829" }\n"4830" else if(nHoverToken != -1 && nHoverTokenLogIndex != -1)\n"4831" {\n"4832" fTimeBegin = RangeCpu.Begin;\n"4833" fTimeEnd = RangeCpu.End;\n"4834" nLog = nHoverTokenLogIndex;\n"4835" }\n"4836" else\n"4837" {\n"4838" return;\n"4839" }\n"4840" if(nLog<0)\n"4841" {\n"4842" return;\n"4843" }\n"4844" let Forward = Direction && Direction < 0 ? 0 : 1;\n"4845" let bFound = false;\n"4846" let nStackPos = 0;\n"4847" let fResultTimeBegin, fResultTimeEnd;\n"4848" let TypeBegin = Forward ? 1 : 0;\n"4849" let TypeEnd = Forward ? 0 : 1;\n"4850" let SearchTimeBegin = Forward ? fTimeBegin : fTimeEnd;\n"4851"\n"4852" let istart = Forward ? 0 : Source.Frames.length-1;\n"4853" let iend = Forward ? Source.Frames.length : -1;\n"4854" let idelta = Forward ? 1 : -1;\n"4855" for(let i = istart; i != iend; i += idelta)\n"4856" {\n"4857" let fr = Source.Frames[i];\n"4858" let ts = fr.ts[nLog];\n"4859" let ti = fr.ti[nLog];\n"4860" let tt = fr.tt[nLog];\n"4861" let jstart = Forward ? 0 : ts.length-1;\n"4862" let jend = Forward ? ts.length : -1;\n"4863" let jdelta = Forward ? 1 : -1;\n"4864" for(let j = jstart; j != jend; j += jdelta)\n"4865" {\n"4866" if(!bFound)\n"4867" {\n"4868" if(tt[j] == TypeBegin && Index == ti[j])\n"4869" {\n"4870" if(SearchTimeBegin == ts[j])\n"4871" {\n"4872" bFound = true;\n"4873" }\n"4874" }\n"4875" }\n"4876" else\n"4877" {\n"4878" if(Index == ti[j])\n"4879" {\n"4880" let type = tt[j];\n"4881" if(type == TypeBegin)\n"4882" {\n"4883" if(0 == nStackPos)\n"4884" {\n"4885" fResultTimeBegin = ts[j];\n"4886" }\n"4887" nStackPos++;\n"4888" }\n"4889" else if(type == TypeEnd && nStackPos)\n"4890" {\n"4891" nStackPos--;\n"4892" if(0 == nStackPos)\n"4893" {\n"4894" fResultTimeEnd = ts[j];\n"4895" if(0 == Forward)\n"4896" {\n"4897" let Tmp = fResultTimeBegin;\n"4898" fResultTimeBegin = fResultTimeEnd;\n"4899" fResultTimeEnd = Tmp;\n"4900" }\n"4901" RangeSelect.Begin = fResultTimeBegin;\n"4902" RangeSelect.End = fResultTimeEnd;\n"4903" RangeSelect.Thread = nLog;\n"4904" RangeSelect.Index = Index;\n"4905" MoveTo(fResultTimeBegin + Offset,fResultTimeEnd + Offset);\n"4906" return;\n"4907" }\n"4908" }\n"4909" }\n"4910" }\n"4911" }\n"4912" }\n"4913"}\n"4914"\n"4915"\n"4916"function MoveTo(fMoveBegin, fMoveEnd, YTop, YBottom)\n"4917"{\n"4918" var nOffsetYBottom = YBottom - nHeight;\n"4919" var nOffsetYDest = nOffsetY;\n"4920" if(nOffsetYDest < nOffsetYBottom)\n"4921" {\n"4922" nOffsetYDest = nOffsetYBottom;\n"4923" }\n"4924" if(nOffsetYDest > YTop)\n"4925" {\n"4926" nOffsetYDest = YTop;\n"4927" }\n"4928" var fRange = fDetailedRange;\n"4929" var fMinRange = (fMoveEnd-fMoveBegin) * 2.0;\n"4930" if(fRange < fMinRange)\n"4931" {\n"4932" fRange = fMinRange;\n"4933" }\n"4934" var fMoveCenter = (fMoveBegin + fMoveEnd) * 0.5;\n"4935" fMoveBegin = fMoveCenter - 0.5 * fRange;\n"4936" fMoveEnd = fMoveCenter + 0.5 * fRange;\n"4937" var nOffset;\n"4938" if(nOffsetYDest != nOffsetY)\n"4939" nOffset = nOffsetYDest;\n"4940" ZoomTo(fMoveBegin, fMoveEnd, nOffsetYDest, -1);\n"4941"}\n"4942"\n"4943"function ZoomToRange(R)\n"4944"{\n"4945" ZoomTo(R.Begin, R.End, 0, 0, R.Off);\n"4946"}\n"4947"\n"4948"let ZoomCallback = null;\n"4949"\n"4950"function ZoomTo(fZoomBegin, fZoomEnd, OffsetYDest, ZoomTime, fOffset)\n"4951"{\n"4952" if(fZoomBegin < fZoomEnd)\n"4953" {\n"4954" if(fOffset)\n"4955" {\n"4956" fZoomBegin -= fOffset;\n"4957" fZoomEnd -= fOffset;\n"4958" }\n"4959" AnimationActive = true;\n"4960" var fDetailedOffsetOriginal = fDetailedOffset;\n"4961" var fDetailedRangeOriginal = fDetailedRange;\n"4962" var fDetailedOffsetTarget = fZoomBegin;\n"4963" var fDetailedRangeTarget = fZoomEnd - fZoomBegin;\n"4964" var OffsetYOriginal = nOffsetY;\n"4965" var OffsetYTarget = OffsetYDest;\n"4966" var TimestampStart = new Date();\n"4967" var count = 0;\n"4968" if(!ZoomTime)\n"4969" {\n"4970" ZoomTime = ZOOM_TIME;\n"4971" }\n"4972"\n"4973" function ZoomFunc()\n"4974" {\n"4975" ZoomActive = 1;\n"4976" var fPrc = (new Date() - TimestampStart) / (ZoomTime * 1000.0);\n"4977" if(fPrc > 1.0 || ZoomTime < 0.01)\n"4978" {\n"4979" fPrc = 1.0;\n"4980" }\n"4981" fPrc = Math.pow(fPrc, 0.3);\n"4982" fDetailedOffset = fDetailedOffsetOriginal + (fDetailedOffsetTarget - fDetailedOffsetOriginal) * fPrc;\n"4983" fDetailedRange = fDetailedRangeOriginal + (fDetailedRangeTarget - fDetailedRangeOriginal) * fPrc;\n"4984" if(OffsetYDest)\n"4985" {\n"4986" nOffsetY = OffsetYOriginal + (OffsetYTarget - OffsetYOriginal) * fPrc;\n"4987" }\n"4988" if(fPrc >= 1.0)\n"4989" {\n"4990" AnimationActive = false;\n"4991" fDetailedOffset = fDetailedOffsetTarget;\n"4992" fDetailedRange = fDetailedRangeTarget;\n"4993" if(OffsetYDest)\n"4994" {\n"4995" nOffsetY = OffsetYTarget;\n"4996" }\n"4997" ZoomCallback = null;\n"4998" }\n"4999" else\n"5000" {\n"5001" RequestRedraw();\n"5002" }\n"5003" return 1;\n"5004" }\n"5005" ZoomCallback = ZoomFunc;\n"5006" RequestRedraw();\n"5007" }\n"5008"}\n"5009"\n"5010"function RequestAnimationFrame(cb)\n"5011"{\n"5012" if(!RedrawRequested)\n"5013" {\n"5014" let RedrawCallback = function(foo)\n"5015" {\n"5016" RedrawRequested = 0;\n"5017" cb(foo);\n"5018" };\n"5019" RedrawRequested = 1;\n"5020" requestAnimationFrame(RedrawCallback);\n"5021" }\n"5022"}\n"5023"\n"5024"function RequestRedraw(FullRedraw)\n"5025"{\n"5026" if(!RedrawRequested)\n"5027" {\n"5028" RequestAnimationFrame(Draw);\n"5029" }\n"5030"}\n"5031"\n"5032"function UpdateFilterSearch()\n"5033"{\n"5034" let Value = FilterInputSearch2.value;\n"5035" if(Value != FilterInputSearchValue)\n"5036" {\n"5037" FilterInputSearchValue = Value;\n"5038" let FilterSearch = CreateFilter(FilterInputSearchValue);\n"5039" if(!FilterSearch)\n"5040" {\n"5041" FilterInputSearchActive2 = false;\n"5042" }\n"5043" else\n"5044" {\n"5045" FilterInputSearchActive2 = true;\n"5046" let States = new Array();\n"5047" States.push(S);\n"5048" if(S2 && S2.TimerInfo)\n"5049" States.push(S2);\n"5050" for(let i in States)\n"5051" {\n"5052" let State = States[i];\n"5053" for(let j in State.TimerInfo)\n"5054" {\n"5055" let TI = State.TimerInfo[j];\n"5056" let Name = TI.name;\n"5057" if(FilterMatch(FilterSearch, Name))\n"5058" {\n"5059" TI.search = CIDMatch;\n"5060" }\n"5061" else\n"5062" {\n"5063" TI.search = CIDFail;\n"5064" }\n"5065" }\n"5066" }\n"5067" for(let i = 0; i < Timeline.Names.length; ++i)\n"5068" {\n"5069" Timeline.SearchMatch[i] = FilterMatch(FilterSearch, Timeline.Names[i]);\n"5070" }\n"5071" }\n"5072" }\n"5073"}\n"5074"\n"5075"\n"5076"function Draw()\n"5077"{\n"5078" let ProfileDrawStart = new Date();\n"5079"\n"5080" UpdateFilterSearch();\n"5081" let RedrawMode = 1;\n"5082" let RedrawAgain = 0;\n"5083" RedrawMode = 1;\n"5084" if(Mode == ModeDetailed)\n"5085" {\n"5086" if(ProfileMode == 2 || ((nHoverCSCpu >= 0 || nHoverToken != -1) && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)||(Invalidate<2 && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton))\n"5087" {\n"5088" RedrawMode = 1;\n"5089" RedrawAgain = 1;\n"5090" }\n"5091" }\n"5092" else\n"5093" {\n"5094" if(Invalidate < 1)\n"5095" {\n"5096" RedrawMode = 1;\n"5097" }\n"5098" }\n"5099"\n"5100" if(!Initialized)\n"5101" {\n"5102" return;\n"5103" }\n"5104" if(InsideDraw)\n"5105" {\n"5106" debugger;\n"5107" return;\n"5108" }\n"5109" let ZoomActive = 0;\n"5110" if(ZoomCallback)\n"5111" {\n"5112" ZoomActive = ZoomCallback();\n"5113" }\n"5114" InsideDraw = 1;\n"5115" if(ProfileMode)\n"5116" {\n"5117" ProfileModeClear();\n"5118" ProfileEnter(\"Total\");\n"5119" }\n"5120"\n"5121" if(ZoomActive)\n"5122" {\n"5123" DrawDetailed(true);\n"5124" }\n"5125" else if(RedrawMode == 1)\n"5126" {\n"5127" if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"5128" {\n"5129" DrawBarView();\n"5130" DrawHoverToolTip();\n"5131" }\n"5132" else if(Mode == ModeDetailed)\n"5133" {\n"5134" DrawDetailed(false);\n"5135" DrawHoverToolTip();\n"5136" }\n"5137" else if(Mode == ModeCounters)\n"5138" {\n"5139" DrawCounterView();\n"5140" DrawHoverToolTip();\n"5141" }\n"5142" }\n"5143" DrawDetailedFrameHistory();\n"5144" DrawMenu();\n"5145"\n"5146"\n"5147" if(ProfileMode)\n"5148" {\n"5149" ProfileLeave();\n"5150" ProfileModeDraw(CanvasDetailedView);\n"5151" }\n"5152"\n"5153" InsideDraw = 0;\n"5154" {\n"5155" let ProfileDrawEnd = new Date();\n"5156" let DrawTime = ProfileDrawEnd - ProfileDrawStart;\n"5157" let Delta = ProfileDrawStart - ProfileDrawStartLast;\n"5158" let Draw2Draw = ProfileDrawStart - ProfileDrawEndLast;\n"5159"\n"5160" if(ProfileMode != 3)\n"5161" {\n"5162" PushIntoArray(ProfileDrawTime, DrawTime);\n"5163" PushIntoArray(ProfileDeltaTime, Delta);\n"5164" PushIntoArray(ProfileDraw2Draw, Draw2Draw);\n"5165" }\n"5166" ProfileDrawStartLast = ProfileDrawStart;\n"5167" ProfileDrawEndLast = ProfileDrawEnd;\n"5168" }\n"5169"\n"5170" if(RedrawAgain)\n"5171" {\n"5172" RequestRedraw();\n"5173" }\n"5174" MouseReleased = false;\n"5175"}\n"5176"\n"5177"function MoveFilterInputMenuDiv(x, y, w)\n"5178"{\n"5179" if(FilterInputMenuDivPos.x != x || FilterInputMenuDivPos.y != y || FilterInputMenuDivPos.w != w)\n"5180" {\n"5181" FilterInputMenuDivPos.x = x;\n"5182" FilterInputMenuDivPos.y = y;\n"5183" FilterInputMenuDivPos.w = w;\n"5184" FilterInputMenuDiv.style[\'left\'] = x + \'px\';\n"5185" FilterInputMenuDiv.style[\'top\'] = y + \'px\';\n"5186" FilterInputMenu.style[\'width\'] = w + \'px\';\n"5187" }\n"5188"}\n"5189"function MoveFilterInputDiv(x, y, w)\n"5190"{\n"5191" if(FilterInputDivPos.x != x || FilterInputDivPos.y != y || FilterInputDivPos.w != w)\n"5192" {\n"5193" FilterInputDivPos.x = x;\n"5194" FilterInputDivPos.y = y;\n"5195" FilterInputDivPos.w = w;\n"5196" FilterInputDiv.style[\'left\'] = x + \'px\';\n"5197" FilterInputDiv.style[\'top\'] = (y + (CanvasHistory.height / DPR)) + \'px\';\n"5198" FilterInput.style[\'width\'] = w + \'px\';\n"5199" }\n"5200"}\n"5201"\n"5202"\n"5203"function MakeMenuItem(name, f, visible)\n"5204"{\n"5205" var Item = {};\n"5206" Item.name = name;\n"5207" Item.f = f;\n"5208" Item.w = name.length;\n"5209" Item.x = 0;\n"5210" Item.y = 0;\n"5211" Item.visible = visible;\n"5212" return Item;\n"5213"}\n"5214"function EnableMenu(m)\n"5215"{\n"5216" if(m != SubMenuActive)\n"5217" {\n"5218" if(SubMenuActive == SubMenuThreads)\n"5219" {\n"5220" FilterInputMenuThreadsValue = FilterInputMenu.value;\n"5221" }\n"5222" else if(SubMenuActive == SubMenuGroups)\n"5223" {\n"5224" FilterInputMenuGroupsValue = FilterInputMenu.value;\n"5225" }\n"5226"\n"5227" SubMenuActive = m;\n"5228" SubMenuTimeout = new Date();\n"5229"\n"5230" if(SubMenuActive == SubMenuThreads)\n"5231" {\n"5232" FilterInputMenu.value = FilterInputMenuThreadsValue;\n"5233" FilterInputMenu.focus();\n"5234" }\n"5235" else if(SubMenuActive == SubMenuGroups)\n"5236" {\n"5237" FilterInputMenu.value = FilterInputMenuGroupsValue;\n"5238" FilterInputMenu.focus();\n"5239" }\n"5240" FilterInputMenuValueLast = FilterInput.value;\n"5241" // if(m == SubMenuHelp)\n"5242" {\n"5243" let info = document.getElementById(\"divFrameInfo\");\n"5244" info.display = \'inline\';\n"5245" }\n"5246" }\n"5247" if(m == -1)\n"5248" {\n"5249" SubMenuTimeout = 0;\n"5250" }\n"5251" if(SubMenuActive == SubMenuGroups || SubMenuActive == SubMenuThreads)\n"5252" {\n"5253" FilterInputMenuDiv.style[\'display\'] = \'inline\';\n"5254" FilterInputMenu.focus();\n"5255" }\n"5256" else\n"5257" {\n"5258" FilterInputMenuDiv.style[\'display\'] = \'none\';\n"5259" }\n"5260"}\n"5261"function InitMenu()\n"5262"{\n"5263" MenuItems = [];\n"5264" MenuItems.push(MakeMenuItem(\"?\", function(){EnableMenu(SubMenuHelp); } ));\n"5265" MenuItems.push(MakeMenuItem(\"Mode\", function(){EnableMenu(SubMenuMode); } ));\n"5266" MenuItems.push(MakeMenuItem(\"Reference\", function(){EnableMenu(SubMenuReference); } ));\n"5267" MenuItems.push(MakeMenuItem(\"Target\", function(){EnableMenu(SubMenuTarget); } ));\n"5268" MenuItems.push(MakeMenuItem(\"Threads\", function(){ EnableMenu(SubMenuThreads); }, function(){ return Mode != ModeCounters && Mode != ModeTimers_Groups; }));\n"5269" MenuItems.push(MakeMenuItem(\"Groups\", function(){ EnableMenu(SubMenuGroups); }, function() { return Mode != ModeDetailed && Mode != ModeCounters && Mode != ModeTimers_Threads; } ));\n"5270" MenuItems.push(MakeMenuItem(\"Columns\", function(){ EnableMenu(SubMenuColumns); }, function(){return Mode == ModeTimers; } ));\n"5271" MenuItems.push(MakeMenuItem(\"Options\", function(){ EnableMenu(SubMenuOptions); } ));\n"5272" MenuItems.push(MakeMenuItem(\"Compare\", function(){ EnableMenu(SubMenuCompare); } ));\n"5273"}\n"5274"function DrawTopMenu(context)\n"5275"{\n"5276" MenuItems[SubMenuMode].name = \"Mode[\" + ModeItems[Mode] + \"]\";\n"5277" let X = 2;\n"5278" let Y = 0;\n"5279" let MouseInY = GlobalMouseY < BoxHeight;\n"5280" for(let i = 0; i < MenuItems.length; ++i)\n"5281" {\n"5282" let Item = MenuItems[i];\n"5283" if(Item.visible == null || Item.visible())\n"5284" {\n"5285" let w = context.measureText(Item.name).width + 4;\n"5286" let MouseIn = MouseInY && GlobalMouseX >= X && GlobalMouseX < X + w;\n"5287" let color = MouseIn ? nBackColors[1] : \"black\";\n"5288" Item.x = X;\n"5289" Item.y = Y + BoxHeight;\n"5290" if(MouseIn)\n"5291" {\n"5292" context.fillStyle = \'white\';\n"5293" context.fillRect(X-2, Y, w+4, BoxHeight);\n"5294" // Enable\n"5295" EnableMenu(i);\n"5296" }\n"5297" context.fillStyle = color;\n"5298" context.fillRect(X, Y, w, BoxHeight);\n"5299" context.fillStyle = \"white\";\n"5300" context.fillText(Item.name, X+2, Y+BoxHeight-FontAscent);\n"5301" if(MouseIn && MouseReleased)\n"5302" {\n"5303" Item.f();\n"5304" }\n"5305" X += w + 6;\n"5306" }\n"5307" }\n"5308"\n"5309" return WindowRect(0, 0, X, BoxHeight);\n"5310"}\n"5311"function MenuSize(w)\n"5312"{\n"5313" return WindowRect(nWidth / 2 - w / 2, HistoryHeight + 50,w, nHeight);\n"5314"}\n"5315"function MouseInRect(Rect)\n"5316"{\n"5317" return MouseInside(Rect.x, Rect.y, Rect.w, Rect.h);\n"5318"}\n"5319"function MouseInside(X, Y, W, H)\n"5320"{\n"5321" return GlobalMouseX >= X && GlobalMouseX <= X + W && GlobalMouseY >= Y && GlobalMouseY <= Y + H;\n"5322"}\n"5323"\n"5324"function DrawMenuGeneric(Elements, Active, OnClick, x, y, Elements2)\n"5325"{\n"5326" let context = CanvasMenu.getContext(\'2d\');\n"5327" let nColorIndex = 0;\n"5328" if(Elements2 && Elements2.length != Elements.length)\n"5329" {\n"5330" Elements2 = null;\n"5331" }\n"5332" let h = FontHeight * Elements.length;\n"5333" let w = 20;\n"5334" let w2 = 0;\n"5335" for(let i = 0; i < Elements.length; ++i)\n"5336" {\n"5337" let m = context.measureText(Elements[i]).width;\n"5338" w = w > m ? w : m;\n"5339" if(Elements2)\n"5340" {\n"5341" m = context.measureText(Elements2[i]).width;\n"5342" w2 = w2 > m ? w2 : m;\n"5343" }\n"5344" }\n"5345" w += 10 + w2;\n"5346" let SizeInfo = MenuSize(w);\n"5347" SizeInfo.x = x;\n"5348" SizeInfo.y = y;\n"5349" let X = x;\n"5350" let Y = y;\n"5351"\n"5352"\n"5353" for(let i = 0; i < Elements.length; ++i)\n"5354" {\n"5355" let Selected = Active(i);\n"5356" let Name = Elements[i];\n"5357" let bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight;\n"5358" let bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"5359" let TextY = Y+BoxHeight-FontAscent;\n"5360" context.fillStyle = Selected?\'white\':bgcolor;\n"5361" context.fillRect(X-2, Y, w+4, BoxHeight);\n"5362" context.fillStyle = bgcolor;\n"5363" context.fillRect(X, Y, w, BoxHeight);\n"5364" context.fillStyle = \'white\';\n"5365" context.fillText(Name, X + 2, TextY);\n"5366" if(Elements2)\n"5367" {\n"5368" context.textAlign = \"right\";\n"5369" context.fillText(Elements2[i], X + w , TextY);\n"5370" context.textAlign = \"left\";\n"5371" }\n"5372" context.fillText(Name, X + 2, TextY);\n"5373" if(bMouseIn && MouseReleased)\n"5374" {\n"5375" OnClick(i, Name);\n"5376" }\n"5377" Y += BoxHeight;\n"5378" nColorIndex = 1-nColorIndex;\n"5379" }\n"5380" SizeInfo.h = Y - SizeInfo.y;\n"5381" return SizeInfo;\n"5382"}\n"5383"\n"5384"function DrawMenuReference()\n"5385"{\n"5386" let Names = [];\n"5387" let ActiveIdx = 0;\n"5388" for(let i in ReferenceTimes)\n"5389" {\n"5390" let v = ReferenceTimes[i];\n"5391" if(v < 0)\n"5392" {\n"5393" Names.push(ReferenceTimeAutoString);\n"5394" }\n"5395" else\n"5396" {\n"5397" if(ReferenceTime == ReferenceTimes[i])\n"5398" {\n"5399" ActiveIdx = i;\n"5400" }\n"5401" Names.push(v + \"ms\");\n"5402" }\n"5403" }\n"5404" let Click = function(idx, name)\n"5405" {\n"5406" SetReferenceTime(Names[idx]);\n"5407" RequestRedraw();\n"5408" Invalidate = 0;\n"5409"\n"5410" };\n"5411" let x = MenuItems[SubMenuReference].x;\n"5412" let y = MenuItems[SubMenuReference].y;\n"5413" let Active = function(Idx) { return ActiveIdx == Idx; };\n"5414" return DrawMenuGeneric(Names, Active, Click, x, y, null);\n"5415"}\n"5416"function DrawMenuTarget()\n"5417"{\n"5418" let Names = [];\n"5419" for(let i in TargetTimes)\n"5420" {\n"5421" Names.push(TargetTimes[i] + \"ms\");\n"5422" }\n"5423" let Click = function(idx, name)\n"5424" {\n"5425" SetTargetTime(Names[idx]);\n"5426" RequestRedraw();\n"5427" Invalidate = 0;\n"5428"\n"5429" };\n"5430" let x = MenuItems[SubMenuTarget].x;\n"5431" let y = MenuItems[SubMenuTarget].y;\n"5432" let Active = function(Idx) { return TargetTimes[Idx] == TargetTime; };\n"5433" return DrawMenuGeneric(Names, Active, Click, x, y, null);\n"5434"}\n"5435"\n"5436"function DrawMenuMode()\n"5437"{\n"5438" let Click = function(idx, name)\n"5439" {\n"5440" SetMode(idx,false);\n"5441" MenuItems[SubMenuMode].name = \"Mode[\" + ModeItems[idx] + \"]\";\n"5442" RequestRedraw();\n"5443" Invalidate = 0;\n"5444"\n"5445" };\n"5446" let x = MenuItems[SubMenuMode].x;\n"5447" let y = MenuItems[SubMenuMode].y;\n"5448" let Active = function(Idx) { return Idx == Mode; };\n"5449" return DrawMenuGeneric(ModeItems, Active, Click, x, y, null);\n"5450"}\n"5451"function DrawMenuOptions()\n"5452"{\n"5453" let DrawMode = DrawDetailedNewDraw ? \"DrawMode[New]\":\"DrawMode[Old]\";\n"5454" let OptionNames =[\"Context Switch\", \"MergeDisable\", \"LodDisable\", \"Flame Mode\", \"Compare Reverse\", \"Help\",DrawMode];\n"5455" let Click = function(idx, name)\n"5456" {\n"5457" switch(idx)\n"5458" {\n"5459" case 0: ToggleContextSwitch(); break;\n"5460" case 1: ToggleDisableMerge(); break;\n"5461" case 2: ToggleDisableLod(); break;\n"5462" case 3: ToggleDetailedFlameMode(); break;\n"5463" case 4: ToggleDetailedSecondReverse(); break;\n"5464" case 5: ShowHelp(1,1); break;\n"5465" case 6: ToggleDetailedNewDraw(); break;\n"5466" }\n"5467" RequestRedraw();\n"5468" Invalidate = 0;\n"5469"\n"5470" };\n"5471" let x = MenuItems[SubMenuOptions].x;\n"5472" let y = MenuItems[SubMenuOptions].y;\n"5473" let Active = function(Idx) { return false; };\n"5474" return DrawMenuGeneric(OptionNames, Active, Click, x, y, null);\n"5475"}\n"5476"\n"5477"function DrawMenuColumns()\n"5478"{\n"5479" let Click = function(idx, name)\n"5480" {\n"5481" ToggleColumn(idx);\n"5482"\n"5483" };\n"5484" let x = MenuItems[SubMenuColumns].x;\n"5485" let y = MenuItems[SubMenuColumns].y;\n"5486" let Active = function(Idx) { return ColumnsEnabled[Idx]; };\n"5487" return DrawMenuGeneric(ColumnNames, Active, Click, x, y, null);\n"5488"\n"5489"}\n"5490"\n"5491"function GroupMenuSize()\n"5492"{\n"5493" return MenuSize(300);\n"5494"}\n"5495"\n"5496"function ThreadMenuSize()\n"5497"{\n"5498" return MenuSize(S.ThreadNameWidth + S.ThreadCategoryWidth + 10);\n"5499"}\n"5500"\n"5501"function DrawMenuSeparator(context, X, Y, W, Height)\n"5502"{\n"5503" context.fillStyle = \'grey\';\n"5504" context.fillRect(X-2, Y, W+2, Height);\n"5505"}\n"5506"\n"5507"function DrawMultiMenu(context, X, Y, W, Elements, Callbacks)\n"5508"{\n"5509" let A = Array();\n"5510" let wtemp = W;\n"5511" let bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight;\n"5512"\n"5513" for(let i = 0; i < Elements.length; ++i)\n"5514" {\n"5515" let wElement = context.measureText(Elements[i]).width;\n"5516" if(i > 0)\n"5517" {\n"5518" wElement += 15;\n"5519" wtemp -= wElement;\n"5520" }\n"5521" A.push(wElement);\n"5522" }\n"5523" A[0] = Math.max(wtemp, 0);\n"5524"\n"5525" context.fillStyle = nBackColors[0];\n"5526" context.fillRect(X-2, Y, W, BoxHeight);\n"5527" let XOff = 0;\n"5528" let TextY = Y+BoxHeight-FontAscent;\n"5529" for(let i = 0; i < Elements.length; ++i)\n"5530" {\n"5531" let width = A[i];\n"5532" let Inside = i != 0 && bMouseIn && GlobalMouseX > XOff + X && GlobalMouseX <= XOff + X + width;\n"5533" context.fillStyle = Inside ? nBackColorOffset : nBackColors[0];\n"5534" context.fillRect(X+XOff, Y, width, BoxHeight);\n"5535" context.fillStyle = \'white\';\n"5536" context.textAlign = \'center\';\n"5537" context.fillText(Elements[i], X+XOff + width * 0.5, TextY);\n"5538" XOff += width;\n"5539" if(Inside && MouseReleased && Callbacks[i])\n"5540" {\n"5541" Callbacks[i]();\n"5542" }\n"5543" }\n"5544" context.textAlign = \'left\';\n"5545"}\n"5546"\n"5547"function DrawMenuThreads()\n"5548"{\n"5549" if(FilterInputMenuValueLast != FilterInputMenu.value)\n"5550" {\n"5551" nOffsetMenuThreads = 0;\n"5552" }\n"5553" FilterInputMenuValueLast = FilterInputMenu.value;\n"5554" let FilterArray = CreateFilter(FilterInputMenu.value);\n"5555" let context = CanvasMenu.getContext(\'2d\');\n"5556" let nColorIndex = 0;\n"5557" let SizeInfo = ThreadMenuSize();\n"5558" SizeInfo.x = MenuItems[SubMenuThreads].x;\n"5559" SizeInfo.y = MenuItems[SubMenuThreads].y;\n"5560" let Y = SizeInfo.y;\n"5561" let Width = SizeInfo.w;\n"5562" let Selection = null;\n"5563" let X = SizeInfo.x;\n"5564" MoveFilterInputMenuDiv(SizeInfo.x, SizeInfo.y, SizeInfo.w);\n"5565" Y += 35;\n"5566"\n"5567" let bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight;\n"5568" let bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"5569" let TextY = Y+BoxHeight-FontAscent;\n"5570" let YClear = Y;\n"5571" let TextYClear = TextY;\n"5572" let YStart = Y;\n"5573" let MatchCount = 0;\n"5574" let MouseTaken = bMouseIn;\n"5575"\n"5576" Y += (BoxHeight) * 5 + 3 * 2;\n"5577" nColorIndex = 1-nColorIndex;\n"5578"\n"5579" Y -= nOffsetMenuThreads;\n"5580" let CPULogs = [];\n"5581" let GPULogs = [];\n"5582" for(let i = 0; i < S.ThreadNames.length; ++i)\n"5583" {\n"5584" let Name = S.ThreadNames[i];\n"5585" if(S.ISGPU[i])\n"5586" GPULogs.push(Name);\n"5587" else\n"5588" CPULogs.push(Name);\n"5589" let ParentName = \"ThreadCategory\";\n"5590" if(FilterMatch(FilterArray, ParentName + \" \" + Name))\n"5591" {\n"5592" if(Y > YStart)\n"5593" {\n"5594" let ParentColor = \'white\';\n"5595" let E = IsThreadActive(Name);\n"5596" let AutoHidden = S.ThreadLogAutoHidden[i];\n"5597" bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight && !MouseTaken;\n"5598" bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"5599" TextY = Y+BoxHeight-FontAscent;\n"5600" context.fillStyle = E ? (AutoHidden?\'orange\':\'white\') :bgcolor;\n"5601" context.fillRect(X-2, Y, Width+4, BoxHeight);\n"5602" context.fillStyle = bgcolor;\n"5603" context.fillRect(X, Y, Width, BoxHeight);\n"5604" context.fillStyle = ParentColor;\n"5605" context.fillText(ParentName, X + 2, TextY);\n"5606" context.fillStyle = S.ThreadColors[i].color;\n"5607" context.textAlign = \'right\';\n"5608" context.fillText(Name, X + Width - 2, TextY);\n"5609" context.textAlign = \'left\';\n"5610" if(bMouseIn && MouseReleased)\n"5611" {\n"5612" ToggleThread(Name);\n"5613" RequestRedraw();\n"5614" }\n"5615" }\n"5616" Y += BoxHeight;\n"5617" nColorIndex = 1-nColorIndex;\n"5618" MatchCount++;\n"5619" }\n"5620" }\n"5621" let TextAll = \"All [\" + S.ThreadNames.length + \"]\";\n"5622" let TextFiltered = \"Filtered [\" + MatchCount +\"]\";\n"5623" let TextCPU = \"CPU [\" + CPULogs.length + \"]\";\n"5624" let TextGPU = \"GPU [\" + GPULogs.length + \"]\";\n"5625"\n"5626" let ElementsAll = [TextAll, \"Off\", \"Flip\", \"On\"];\n"5627" let Elements";56285629const size_t g_MicroProfileHtml_end_3_size = sizeof(g_MicroProfileHtml_end_3);5630const char g_MicroProfileHtml_end_4[] =5631"Filtered = [TextFiltered, \"Off\", \"Flip\", \"On\"];\n"5632" let ElementsCPU = [TextCPU, \"Off\", \"Flip\", \"On\"];\n"5633" let ElementsGPU = [TextGPU, \"Off\", \"Flip\", \"On\"];\n"5634" \n"5635" let CallbacksAll = [null,\n"5636" function(){ ToggleThread(0, 1, 0, 0); },\n"5637" function(){ ToggleThread(0, 1, 0, 1); },\n"5638" function(){ ToggleThread(0, 1, 0, 2); },\n"5639" ];\n"5640"\n"5641" let CallbacksCPU = [null,\n"5642" function(){ ToggleThread(0, 0, CPULogs, 0); },\n"5643" function(){ ToggleThread(0, 0, CPULogs, 1); },\n"5644" function(){ ToggleThread(0, 0, CPULogs, 2); },\n"5645" ];\n"5646" let CallbacksGPU = [null,\n"5647" function(){ ToggleThread(0, 0, GPULogs, 0); },\n"5648" function(){ ToggleThread(0, 0, GPULogs, 1); },\n"5649" function(){ ToggleThread(0, 0, GPULogs, 2); },\n"5650" ];\n"5651"\n"5652"\n"5653" let CreateFilteredArray = function()\n"5654" {\n"5655" if(!FilterArray) return S.ThreadNames;\n"5656" let A = [];\n"5657" for(let i = 0; i < S.ThreadNames.length; ++i)\n"5658" {\n"5659" let Name = S.ThreadNames[i];\n"5660" let ParentName = \"ThreadCategory\";\n"5661" if(FilterMatch(FilterArray, ParentName + \" \" + Name))\n"5662" {\n"5663" A.push(Name);\n"5664" }\n"5665" }\n"5666" return A;\n"5667" };\n"5668" let CallbacksFiltered = [null,\n"5669" function(){let F = CreateFilteredArray(); ToggleThread(0, 0, F, 0); },\n"5670" function(){let F = CreateFilteredArray(); ToggleThread(0, 0, F, 1); },\n"5671" function(){let F = CreateFilteredArray(); ToggleThread(0, 0, F, 2); },\n"5672" ];\n"5673"\n"5674"\n"5675" let ElementsOptions = [\"Options\", \"Hide mode:\" + (HideMode==HideModeCollapsed ? \"Collapsed\" : \"Invisible\"), \"AutoHide Empty:\" + (ThreadLogAutoHide ? \"On\": \"Off\")];\n"5676" let CallbacksOptions = [null,\n"5677" function(){\n"5678" HideMode = HideMode == HideModeCollapsed ? HideModeFullyHidden : HideModeCollapsed;\n"5679" RequestRedraw();\n"5680" Invalidate = 0;\n"5681" },\n"5682" function(){\n"5683" ThreadLogAutoHide = ThreadLogAutoHide ? 0 : 1; UpdateThreadLogAutoHide()\n"5684" RequestRedraw();\n"5685" Invalidate = 0;\n"5686" }\n"5687" ];\n"5688"\n"5689" DrawMultiMenu(context, X, YClear, Width, ElementsOptions, CallbacksOptions);\n"5690" YClear += BoxHeight;\n"5691" DrawMenuSeparator(context, X, YClear, Width, 2);\n"5692" YClear += 2;\n"5693" DrawMultiMenu(context, X, YClear, Width, ElementsAll, CallbacksAll);\n"5694" YClear += BoxHeight;\n"5695" DrawMultiMenu(context, X, YClear, Width, ElementsFiltered, CallbacksFiltered);\n"5696" YClear += BoxHeight;\n"5697" DrawMenuSeparator(context, X, YClear, Width, 2);\n"5698" YClear += 2;\n"5699" DrawMultiMenu(context, X, YClear, Width, ElementsGPU, CallbacksGPU);\n"5700" YClear += BoxHeight;\n"5701" DrawMultiMenu(context, X, YClear, Width, ElementsCPU, CallbacksCPU);\n"5702" YClear += BoxHeight;\n"5703" DrawMenuSeparator(context, X, YClear, Width, 2);\n"5704" YClear += 2;\n"5705"\n"5706" SizeInfo.h = Y-SizeInfo.y;\n"5707" return SizeInfo;\n"5708"}\n"5709"\n"5710"function DrawMenuGroups()\n"5711"{\n"5712" if(FilterInputMenuValueLast != FilterInputMenu.value)\n"5713" {\n"5714" nOffsetMenuThreads = 0;\n"5715" }\n"5716" FilterInputMenuValueLast = FilterInputMenu.value;\n"5717" let FilterArray = CreateFilter(FilterInputMenu.value);\n"5718" let context = CanvasMenu.getContext(\'2d\');\n"5719" let nColorIndex = 0;\n"5720" let SizeInfo = ThreadMenuSize();\n"5721" SizeInfo.x = MenuItems[SubMenuGroups].x;\n"5722" SizeInfo.y = MenuItems[SubMenuGroups].y;\n"5723" let Y = SizeInfo.y;\n"5724" let Width = SizeInfo.w;\n"5725" let Selection = null;\n"5726" let X = SizeInfo.x;\n"5727" MoveFilterInputMenuDiv(SizeInfo.x, SizeInfo.y, SizeInfo.w);\n"5728" Y += 35;\n"5729"\n"5730" let bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight;\n"5731" let bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"5732" let TextY = Y+BoxHeight-FontAscent;\n"5733" let YClear = Y;\n"5734" let TextYClear = TextY;\n"5735" let YStart = Y;\n"5736" let MatchCount = 0;\n"5737" let MouseTaken = bMouseIn;\n"5738"\n"5739" Y += BoxHeight * 2;\n"5740" nColorIndex = 1-nColorIndex;\n"5741"\n"5742" Y -= nOffsetMenuThreads;\n"5743"\n"5744"\n"5745"\n"5746" for(var i = 0; i < S.GroupInfo.length; ++i)\n"5747" {\n"5748" let Name = S.GroupInfo[i].name;\n"5749" let ParentName = S.CategoryInfo[S.GroupInfo[i].category];\n"5750" let Color = g_Colors[ S.GroupInfo[i].cid ];\n"5751" if(FilterMatch(FilterArray, ParentName + \" \" + Name))\n"5752" {\n"5753" if(Y > YStart)\n"5754" {\n"5755" var ParentColor = \'white\';\n"5756" let E = !GroupsDisabled[Name];\n"5757" bMouseIn = GlobalMouseY >= Y && GlobalMouseY < Y + BoxHeight && !MouseTaken;\n"5758" bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"5759" TextY = Y+BoxHeight-FontAscent;\n"5760" context.fillStyle = E ? \'white\' :bgcolor;\n"5761" context.fillRect(X-2, Y, Width+4, BoxHeight);\n"5762" context.fillStyle = bgcolor;\n"5763" context.fillRect(X, Y, Width, BoxHeight);\n"5764" context.fillStyle = ParentColor;\n"5765" context.fillText(ParentName, X + 2, TextY);\n"5766" context.fillStyle = Color;\n"5767" context.textAlign = \'right\';\n"5768" context.fillText(Name, X + Width - 2, TextY);\n"5769" context.textAlign = \'left\';\n"5770" if(bMouseIn && MouseReleased)\n"5771" {\n"5772" ToggleGroup(Name);\n"5773" RequestRedraw();\n"5774" }\n"5775" }\n"5776" Y += BoxHeight;\n"5777" nColorIndex = 1-nColorIndex;\n"5778" MatchCount++;\n"5779" }\n"5780" }\n"5781" let TextAll = \"All [\" + S.GroupInfo.length + \"]\";\n"5782" let TextFiltered = \"Filtered [\" + MatchCount +\"]\";\n"5783"\n"5784"\n"5785"\n"5786" let ElementsAll = [TextAll, \"Off\", \"Flip\", \"On\"];\n"5787" let CallbacksAll = [null,\n"5788" function(){ ToggleGroup(0, 1, 0, 0); },\n"5789" function(){ ToggleGroup(0, 1, 0, 1); },\n"5790" function(){ ToggleGroup(0, 1, 0, 2); },\n"5791" ];\n"5792" let ElementsFiltered = [TextFiltered, \"Off\", \"Flip\", \"On\"];\n"5793" let CreateFilteredArray = function()\n"5794" {\n"5795" let A = [];\n"5796" for(let i = 0; i < S.GroupInfo.length; ++i)\n"5797" {\n"5798" let Name = S.GroupInfo[i].name;\n"5799" let ParentName = S.CategoryInfo[S.GroupInfo[i].category];\n"5800" if(FilterMatch(FilterArray, ParentName + \" \" + Name))\n"5801" {\n"5802" A.push(Name);\n"5803" }\n"5804" }\n"5805" return A;\n"5806" };\n"5807" let CallbacksFiltered = [null,\n"5808" function(){let F = CreateFilteredArray(); ToggleGroup(0, 0, F, 0); },\n"5809" function(){let F = CreateFilteredArray(); ToggleGroup(0, 0, F, 1); },\n"5810" function(){let F = CreateFilteredArray(); ToggleGroup(0, 0, F, 2); },\n"5811" ];\n"5812"\n"5813"\n"5814" DrawMultiMenu(context, X, YClear, Width, ElementsAll, CallbacksAll);\n"5815" DrawMultiMenu(context, X, YClear+BoxHeight, Width, ElementsFiltered, CallbacksFiltered);\n"5816"\n"5817" SizeInfo.h = Y-SizeInfo.y;\n"5818" return SizeInfo;\n"5819"\n"5820"\n"5821"}\n"5822"\n"5823"function DrawMenu()\n"5824"{\n"5825" MenuRedraw = 0;\n"5826"\n"5827" var context = CanvasMenu.getContext(\'2d\');\n"5828" context.clearRect(0, 0, CanvasMenu.width, CanvasMenu.height);\n"5829"\n"5830" var nColorIndex = 0;\n"5831" var Y = 50;\n"5832" var Width = 300;\n"5833" var Selection = null;\n"5834"\n"5835" ProfileEnter(\"DrawMenu\");\n"5836" let MenuRect = DrawTopMenu(context);\n"5837" if(SubMenuActive != -1)\n"5838" {\n"5839" MouseMoveTime = new Date();\n"5840" }\n"5841" if(SubMenuActive == SubMenuHelp)\n"5842" {\n"5843" if(MouseReleased)\n"5844" {\n"5845" ToggleDebugMode();\n"5846" }\n"5847" }\n"5848" if(SubMenuActive == SubMenuMode)\n"5849" {\n"5850" MenuRect = DrawMenuMode();\n"5851" }\n"5852" else if(SubMenuActive == SubMenuReference)\n"5853" {\n"5854" MenuRect = DrawMenuReference();\n"5855" }\n"5856" else if(SubMenuActive == SubMenuTarget)\n"5857" {\n"5858" MenuRect = DrawMenuTarget();\n"5859" }\n"5860" else if(SubMenuActive == SubMenuThreads)\n"5861" {\n"5862" MenuRect = DrawMenuThreads();\n"5863" }\n"5864" else if(SubMenuActive == SubMenuGroups)\n"5865" {\n"5866" MenuRect = DrawMenuGroups();\n"5867" }\n"5868" else if(SubMenuActive == SubMenuOptions)\n"5869" {\n"5870" MenuRect = DrawMenuOptions();\n"5871" }\n"5872" else if(SubMenuActive == SubMenuCompare)\n"5873" {\n"5874" if(MouseReleased)\n"5875" {\n"5876" ComparePrompt();\n"5877" }\n"5878" }\n"5879" else if(SubMenuActive == SubMenuColumns)\n"5880" {\n"5881" MenuRect = DrawMenuColumns();\n"5882" }\n"5883" var Grow = 10;\n"5884" MenuRect.x -= Grow;\n"5885" MenuRect.y -= Grow;\n"5886" MenuRect.h += 2*Grow;\n"5887" MenuRect.w += 2*Grow;\n"5888" var MouseMoved = GlobalMouseX != SubMenuMouseX || GlobalMouseY != SubMenuMouseY;\n"5889"\n"5890" if(MouseInRect(MenuRect) || !MouseMoved)\n"5891" {\n"5892" SubMenuTimeout = new Date();\n"5893" SubMenuMouseX = GlobalMouseX;\n"5894" SubMenuMouseY = GlobalMouseY;\n"5895" }\n"5896" else\n"5897" {\n"5898" var Time = new Date() - SubMenuTimeout;\n"5899" var Dest = SubMenuTimeoutBase * 1000;\n"5900" if(Time > Dest)\n"5901" {\n"5902" EnableMenu(-1);\n"5903" }\n"5904" }\n"5905" if(0)//debugging of menu extents. dont delete\n"5906" {\n"5907" context.strokeStyle = \'red\';\n"5908" context.beginPath();\n"5909" context.moveTo(MenuRect.x,MenuRect.y);\n"5910" context.lineTo(MenuRect.x + MenuRect.w,MenuRect.y);\n"5911" context.lineTo(MenuRect.x + MenuRect.w,MenuRect.y+MenuRect.h);\n"5912" context.lineTo(MenuRect.x,MenuRect.y+MenuRect.h);\n"5913" context.lineTo(MenuRect.x,MenuRect.y);\n"5914" context.stroke();\n"5915" } // SpinnerDraw(SpinnerShow(), context, SpinnerCorner, 0, nHeight-20, 20, 20);\n"5916" ProfileLeave();\n"5917"}\n"5918"\n"5919"\n"5920"function ZoomGraph(nZoom)\n"5921"{\n"5922" var fOldRange = fDetailedRange;\n"5923" if(nZoom>0)\n"5924" {\n"5925" fDetailedRange *= Math.pow(nModDown ? 1.40 : 1.03, nZoom);\n"5926" }\n"5927" else\n"5928" {\n"5929" var fNewDetailedRange = fDetailedRange / Math.pow((nModDown ? 1.40 : 1.03), -nZoom);\n"5930" if(fNewDetailedRange < 0.0001) //100ns\n"5931" fNewDetailedRange = 0.0001;\n"5932" fDetailedRange = fNewDetailedRange;\n"5933" }\n"5934"\n"5935" var fDiff = fOldRange - fDetailedRange;\n"5936" var fMousePrc = DetailedViewMouseX / nWidth;\n"5937" if(fMousePrc < 0)\n"5938" {\n"5939" fMousePrc = 0;\n"5940" }\n"5941" fDetailedOffset += fDiff * fMousePrc;\n"5942"\n"5943"}\n"5944"\n"5945"function MeasureFont()\n"5946"{\n"5947" var context = CanvasDetailedView.getContext(\'2d\');\n"5948" context.font = Font;\n"5949" FontWidth = context.measureText(\'W\').width;\n"5950"\n"5951"}\n"5952"function ResizeCanvas()\n"5953"{\n"5954" nWidth = window.innerWidth;\n"5955" nHeight = window.innerHeight - CanvasHistory.height-2;\n"5956" DPR = window.devicePixelRatio;\n"5957"\n"5958" if(DPR)\n"5959" {\n"5960" nHeight = window.innerHeight - (CanvasHistory.height / DPR)-2;\n"5961" CanvasDetailedView.style.width = nWidth + \'px\';\n"5962" CanvasDetailedView.style.height = nHeight + \'px\';\n"5963" CanvasDetailedView.width = nWidth * DPR;\n"5964" CanvasDetailedView.height = nHeight * DPR;\n"5965" CanvasHistory.style.width = window.innerWidth + \'px\';\n"5966" CanvasHistory.style.height = 70 + \'px\';\n"5967" CanvasHistory.width = window.innerWidth * DPR;\n"5968" CanvasHistory.height = 70 * DPR;\n"5969" CanvasMenu.style.width = window.innerWidth + \'px\';\n"5970" CanvasMenu.style.height = window.innerHeight + \'px\';\n"5971" CanvasMenu.width = window.innerWidth * DPR;\n"5972" CanvasMenu.height = window.innerHeight * DPR;\n"5973" CanvasHistory.getContext(\'2d\').scale(DPR,DPR);\n"5974" CanvasDetailedView.getContext(\'2d\').scale(DPR,DPR);\n"5975" CanvasMenu.getContext(\'2d\').scale(DPR,DPR);\n"5976"\n"5977" CanvasDetailedOffscreen.style.width = nWidth + \'px\';\n"5978" CanvasDetailedOffscreen.style.height = nHeight + \'px\';\n"5979" CanvasDetailedOffscreen.width = nWidth * DPR;\n"5980" CanvasDetailedOffscreen.height = nHeight * DPR;\n"5981" CanvasDetailedOffscreen.getContext(\'2d\').scale(DPR,DPR);\n"5982"\n"5983" }\n"5984" else\n"5985" {\n"5986" DPR = 1;\n"5987" CanvasDetailedView.width = nWidth;\n"5988" CanvasDetailedView.height = nHeight;\n"5989" CanvasDetailedOffscreen.width = nWidth;\n"5990" CanvasDetailedOffscreen.height = nHeight;\n"5991"\n"5992" CanvasMenu.width = window.innerWidth;\n"5993" CanvasMenu.height = window.innerHeight;\n"5994" CanvasHistory.width = window.innerWidth;\n"5995" }\n"5996" RequestRedraw();\n"5997"}\n"5998"\n"5999"\n"6000"var MouseDragOff = 0;\n"6001"var MouseDragDown = 1;\n"6002"var MouseDragUp = 2;\n"6003"var MouseDragMove = 3;\n"6004"var MouseDragState = MouseDragOff;\n"6005"var MouseDragTarget = 0;\n"6006"var MouseDragButton = 0;\n"6007"var MouseDragButtonNext = 0;\n"6008"var MouseDragKeyShift = 0;\n"6009"var MouseDragKeyCtrl = 0;\n"6010"var MouseDragKeyAlt = 0;\n"6011"var MouseDragX = 0;\n"6012"var MouseDragY = 0;\n"6013"var MouseDragXLast = 0;\n"6014"var MouseDragYLast = 0;\n"6015"var MouseDragXStart = 0;\n"6016"var MouseDragYStart = 0;\n"6017"\n"6018"function clamp(number, min, max)\n"6019"{\n"6020" return Math.max(min, Math.min(number, max));\n"6021"}\n"6022"\n"6023"function MouseDragPan()\n"6024"{\n"6025" return (MouseDragButton == 1 && !MouseDragKeyCtrl) || MouseDragKeyShift || MouseDragKeyAlt;\n"6026"}\n"6027"function MouseDragSelectRange()\n"6028"{\n"6029" return MouseDragState == MouseDragMove && (MouseDragButton == 3 || (MouseDragKeyShift && MouseDragKeyCtrl));\n"6030"}\n"6031"function MouseHandleDrag()\n"6032"{\n"6033" if(MouseDragTarget == CanvasDetailedView)\n"6034" {\n"6035" if(Mode == ModeDetailed)\n"6036" {\n"6037"\n"6038" if(FilterSearchActive)\n"6039" {\n"6040" if(MouseDragKeyShift || MouseDragButton == 1)\n"6041" {\n"6042" var Y = MouseDragY - MouseDragYLast;\n"6043" nOffsetFilterSearch -= Y;\n"6044" if(nOffsetFilterSearch < 0)\n"6045" {\n"6046" nOffsetFilterSearch = 0;\n"6047" }\n"6048" }\n"6049" }\n"6050" else\n"6051" {\n"6052" if(MouseDragSelectRange())\n"6053" {\n"6054" var xStart = MouseDragXStart;\n"6055" var xEnd = MouseDragX;\n"6056" if(xStart > xEnd)\n"6057" {\n"6058" var Temp = xStart;\n"6059" xStart = xEnd;\n"6060" xEnd = Temp;\n"6061" }\n"6062" if(xEnd - xStart > 1)\n"6063" {\n"6064" RangeCpu.Begin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n"6065" RangeCpu.End = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n"6066" RangeSelect.Begin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n"6067" RangeSelect.End = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n"6068" RangeSelect.Thread = -1;\n"6069" RangeSelect.Index = -1;\n"6070" }\n"6071" }\n"6072" else if(MouseDragPan())\n"6073" {\n"6074" var X = MouseDragX - MouseDragXLast;\n"6075" var Y = MouseDragY - MouseDragYLast;\n"6076" if(X)\n"6077" {\n"6078" if(MouseDragKeyAlt)\n"6079" {\n"6080" fDetailedOffsetSecond += -X * fDetailedRange / nWidth;\n"6081" }\n"6082" else\n"6083" {\n"6084" fDetailedOffset += -X * fDetailedRange / nWidth;\n"6085" }\n"6086" }\n"6087" if(!MouseDragKeyAlt)\n"6088" {\n"6089" nOffsetY -= Y;\n"6090" }\n"6091" if(nOffsetY < 0)\n"6092" {\n"6093" nOffsetY = 0;\n"6094" }\n"6095" }\n"6096" else if(MouseDragKeyCtrl)\n"6097" {\n"6098" if(MouseDragY != MouseDragYLast)\n"6099" {\n"6100" ZoomGraph(MouseDragY - MouseDragYLast);\n"6101" }\n"6102" }\n"6103" }\n"6104" }\n"6105" else if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"6106" {\n"6107" if(MouseDragKeyShift || MouseDragButton == 1)\n"6108" {\n"6109" var X = MouseDragX - MouseDragXLast;\n"6110" var Y = MouseDragY - MouseDragYLast;\n"6111" nOffsetBarsY -= Y;\n"6112" nOffsetBarsX -= X;\n"6113" if(nOffsetBarsY < 0)\n"6114" {\n"6115" nOffsetBarsY = 0;\n"6116" }\n"6117" if(nOffsetBarsX < 0)\n"6118" {\n"6119" nOffsetBarsX = 0;\n"6120" }\n"6121" }\n"6122" }\n"6123" else if(Mode == ModeCounters)\n"6124" {\n"6125" if(MouseDragKeyShift || MouseDragButton == 1)\n"6126" {\n"6127" var Y = MouseDragY - MouseDragYLast;\n"6128" nOffsetCountersY -= Y;\n"6129" if(nOffsetCountersY < 0)\n"6130" {\n"6131" nOffsetCountersY = 0;\n"6132" }\n"6133" }\n"6134" }\n"6135"\n"6136" }\n"6137" else if(MouseDragTarget == CanvasHistory)\n"6138" {\n"6139" function HistoryFrameTime(x)\n"6140" {\n"6141" var NumFrames = S.Frames.length;\n"6142" var fBarWidth = nWidth / NumFrames;\n"6143" var Index = clamp(Math.floor(NumFrames * x / nWidth), 0, NumFrames-1);\n"6144" var Lerp = clamp((x/fBarWidth - Index) , 0, 1);\n"6145" var time = S.Frames[Index].framestart + (S.Frames[Index].frameend - S.Frames[Index].framestart) * Lerp;\n"6146" return time;\n"6147" }\n"6148" if(MouseDragSelectRange())\n"6149" {\n"6150" RangeCpu = RangeInit();\n"6151" RangeGpu = RangeInit();\n"6152"\n"6153" var xStart = MouseDragXStart;\n"6154" var xEnd = MouseDragX;\n"6155" if(xStart > xEnd)\n"6156" {\n"6157" var Temp = xStart;\n"6158" xStart = xEnd;\n"6159" xEnd = Temp;\n"6160" }\n"6161" if(xEnd - xStart > 2)\n"6162" {\n"6163" var timestart = HistoryFrameTime(xStart);\n"6164" var timeend = HistoryFrameTime(xEnd);\n"6165" fDetailedOffset = timestart;\n"6166" fDetailedRange = timeend-timestart;\n"6167" }\n"6168" }\n"6169" else if(MouseDragPan())\n"6170" {\n"6171" var Time = HistoryFrameTime(MouseDragX);\n"6172" fDetailedOffset = Time - fDetailedRange / 2.0;\n"6173" }\n"6174" }\n"6175"}\n"6176"function MouseHandleDragEnd()\n"6177"{\n"6178" if(MouseDragTarget == CanvasDetailedView)\n"6179" {\n"6180"\n"6181" }\n"6182" else if(MouseDragTarget == CanvasHistory)\n"6183" {\n"6184" if(!MouseDragSelectRange() && !MouseDragPan())\n"6185" {\n"6186" ZoomToHighlight(1);\n"6187" }\n"6188" }\n"6189"}\n"6190"\n"6191"function MouseHandleDragClick()\n"6192"{\n"6193" if(MouseDragTarget == CanvasDetailedView)\n"6194" {\n"6195" if(Mode == ModeCounters)\n"6196" {\n"6197" if(nHoverCounter != -1)\n"6198" {\n"6199" if(S.CounterInfo[nHoverCounter].firstchild != -1)\n"6200" {\n"6201" S.CounterInfo[nHoverCounter].closed = !S.CounterInfo[nHoverCounter].closed;\n"6202" }\n"6203" else\n"6204" {\n"6205" S.CounterInfo[nHoverCounter].Expanded = !S.CounterInfo[nHoverCounter].Expanded;\n"6206" }\n"6207" Draw(1);\n"6208" }\n"6209" }\n"6210" else if(Mode == ModeDetailed && FilterSearchSelection >= 0)\n"6211" {\n"6212" FilterInputCommit();\n"6213" }\n"6214" else\n"6215" {\n"6216" if(DetailedMouseEvent)\n"6217" {\n"6218" DetailedMouseEvent.E();\n"6219" }\n"6220" else if(!DetailedMouseOverButton)\n"6221" {\n"6222" ZoomToHighlight();\n"6223" }\n"6224" }\n"6225" }\n"6226" else if(MouseDragTarget == CanvasHistory)\n"6227" {\n"6228" if(Mode == ModeDetailed)\n"6229" {\n"6230" ZoomToHighlight(1);\n"6231" }\n"6232" }\n"6233"}\n"6234"\n"6235"function MapMouseButton(event)\n"6236"{\n"6237" if(event.button == 1 || event.which == 1)\n"6238" {\n"6239" return 1;\n"6240" }\n"6241" else if(event.button == 3 || event.which == 3)\n"6242" {\n"6243" return 3;\n"6244" }\n"6245" else\n"6246" {\n"6247" return 0;\n"6248" }\n"6249"}\n"6250"\n"6251"function MouseDragIsActive()\n"6252"{\n"6253" return MouseDragState != MouseDragOff && MouseDragState != MouseDragDown;\n"6254"}\n"6255"function MouseDragReset()\n"6256"{\n"6257" MouseDragState = MouseDragOff;\n"6258" MouseDragTarget = 0;\n"6259" MouseDragKeyShift = 0;\n"6260" MouseDragKeyCtrl = 0;\n"6261" MouseDragKeyAlt = 0;\n"6262" MouseDragButton = 0;\n"6263"}\n"6264"function MouseDragKeyUp()\n"6265"{\n"6266" if((MouseDragKeyShift && !KeyShiftDown) || (MouseDragKeyCtrl && !KeyCtrlDown) || (MouseDragKeyAlt && !KeyAltDown) || SubMenuActive != -1)\n"6267" {\n"6268" MouseHandleDragEnd();\n"6269" MouseDragReset();\n"6270" }\n"6271"}\n"6272"function MouseDrag(Source, Event)\n"6273"{\n"6274" if(Source == MouseDragOff || (MouseDragTarget && MouseDragTarget != Event.target) || SubMenuActive != -1)\n"6275" {\n"6276" MouseDragReset();\n"6277" return;\n"6278" }\n"6279" var LocalRect = Event.target.getBoundingClientRect();\n"6280" MouseDragX = Event.clientX - LocalRect.left;\n"6281" MouseDragY = Event.clientY - LocalRect.top;\n"6282" if(MouseDragState == MouseDragMove)\n"6283" {\n"6284" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"6285" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"6286" if((Source == MouseDragUp && MapMouseButton(Event) == MouseDragButton) ||\n"6287" (MouseDragKeyCtrl && !KeyCtrlDown) ||\n"6288" (MouseDragKeyShift && !KeyShiftDown) ||\n"6289" (MouseDragKeyAlt && !KeyAltDown))\n"6290" {\n"6291" MouseHandleDragEnd();\n"6292" MouseDragReset();\n"6293" return;\n"6294" }\n"6295" else\n"6296" {\n"6297" MouseHandleDrag();\n"6298" }\n"6299" }\n"6300" else if(MouseDragState == MouseDragOff)\n"6301" {\n"6302" if(Source == MouseDragDown || KeyShiftDown || KeyCtrlDown|| KeyAltDown)\n"6303" {\n"6304" MouseDragTarget = Event.target;\n"6305" MouseDragButton = MapMouseButton(Event);\n"6306" MouseDragState = MouseDragDown;\n"6307" MouseDragXStart = MouseDragX;\n"6308" MouseDragYStart = MouseDragY;\n"6309" MouseDragKeyCtrl = 0;\n"6310" MouseDragKeyShift = 0;\n"6311" MouseDragKeyAlt = 0;\n"6312"\n"6313" if(KeyShiftDown || KeyCtrlDown || KeyAltDown)\n"6314" {\n"6315" MouseDragKeyAlt = KeyAltDown;\n"6316" MouseDragKeyShift = KeyShiftDown;\n"6317" MouseDragKeyCtrl = KeyCtrlDown;\n"6318" MouseDragState = MouseDragMove;\n"6319" }\n"6320" }\n"6321" }\n"6322" else if(MouseDragState == MouseDragDown)\n"6323" {\n"6324" if(Source == MouseDragUp)\n"6325" {\n"6326" MouseHandleDragClick();\n"6327" MouseDragReset();\n"6328" }\n"6329" else if(Source == MouseDragMove)\n"6330" {\n"6331" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"6332" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"6333" if(dx+dy>1)\n"6334" {\n"6335" MouseDragState = MouseDragMove;\n"6336" }\n"6337" }\n"6338" }\n"6339" MouseDragXLast = MouseDragX;\n"6340" MouseDragYLast = MouseDragY;\n"6341"}\n"6342"\n"6343"function MouseMove(evt)\n"6344"{\n"6345" evt.preventDefault();\n"6346" KeyCtrlDown = evt.ctrlKey;\n"6347" KeyShiftDown = evt.shiftKey;\n"6348" KeyAltDown = evt.altKey;\n"6349" ZoomActive = 0;\n"6350" MouseDrag(MouseDragMove, evt);\n"6351" MouseHistory = 0;\n"6352" MouseDetailed = 0;\n"6353" HistoryViewMouseX = HistoryViewMouseY = -1;\n"6354" let rect = evt.target.getBoundingClientRect();\n"6355" let x = evt.clientX - rect.left;\n"6356" let y = evt.clientY - rect.top;\n"6357" GlobalMouseX = evt.pageX;\n"6358" GlobalMouseY = evt.pageY;\n"6359" if(evt.target == CanvasDetailedView)\n"6360" {\n"6361" if(!MouseDragSelectRange())\n"6362" {\n"6363" RangeCpu = RangeInit();\n"6364" }\n"6365" DetailedViewMouseX = x;\n"6366" DetailedViewMouseY = y;\n"6367" }\n"6368" else if(evt.target = CanvasHistory)\n"6369" {\n"6370" HistoryViewMouseX = x;\n"6371" HistoryViewMouseY = y;\n"6372"\n"6373" DetailedViewMouseX = -1;\n"6374" DetailedViewMouseY = -1;\n"6375"\n"6376" }\n"6377" RequestRedraw();\n"6378"}\n"6379"\n"6380"function MouseSortClick()\n"6381"{\n"6382" if(SortColumnMouseOverNext)\n"6383" {\n"6384" if(SortColumnMouseOverNext == SortColumnMouseOver)\n"6385" {\n"6386" SortColumnOrderFlip = 1 - SortColumnOrderFlip;\n"6387" }\n"6388" else\n"6389" {\n"6390" SortColumnOrderFlip = 0;\n"6391" }\n"6392"\n"6393" SortColumnMouseOver = SortColumnMouseOverNext;\n"6394" SortColumnMouseOverNext = null;\n"6395" if(SortColumnMouseOver == StrAverage)\n"6396" {\n"6397" SortColumn = 1;\n"6398" }\n"6399" else if(SortColumnMouseOver == StrMax)\n"6400" {\n"6401" SortColumn = 2;\n"6402" }\n"6403" else if(SortColumnMouseOver == StrTotal)\n"6404" {\n"6405" SortColumn = 3;\n"6406" }\n"6407" else if(SortColumnMouseOver == StrMin)\n"6408" {\n"6409" SortColumn = 4;\n"6410" }\n"6411" else if(SortColumnMouseOver == StrSpike)\n"6412" {\n"6413" SortColumn = 5;\n"6414" }\n"6415" else if(SortColumnMouseOver == StrCallAverage)\n"6416" {\n"6417" SortColumn = 6;\n"6418" }\n"6419" else if(SortColumnMouseOver == StrCount)\n"6420" {\n"6421" SortColumn = 7;\n"6422" }\n"6423" else if(SortColumnMouseOver == StrExclAverage)\n"6424" {\n"6425" SortColumn = 8;\n"6426" }\n"6427" else if(SortColumnMouseOver == StrExclMax)\n"6428" {\n"6429" SortColumn = 9;\n"6430" }\n"6431" else if(SortColumnMouseOver == StrGroup)\n"6432" {\n"6433" SortColumn = 0;\n"6434" }\n"6435" RequestRedraw();\n"6436" }\n"6437"}\n"6438"\n"6439"function MouseButton(bPressed, evt)\n"6440"{\n"6441" evt.preventDefault();\n"6442" MouseReleased = !bPressed;\n"6443" MouseDrag(bPressed ? MouseDragDown : MouseDragUp, evt);\n"6444" if(!bPressed && SubMenuActive == -1)\n"6445" MouseSortClick();\n"6446" RequestRedraw();\n"6447"}\n"6448"\n"6449"function MouseOut(evt)\n"6450"{\n"6451" MouseDrag(MouseDragOff, evt);\n"6452" KeyCtrlDown = 0;\n"6453" KeyShiftDown = 0;\n"6454" KeyAltDown = 0;\n"6455" KeyHDown = 0;\n"6456" MouseDragButton = 0;\n"6457" nHoverToken = -1;\n"6458" RangeCpu = RangeInit();\n"6459" RequestRedraw();\n"6460"}\n"6461"\n"6462"function MouseWheel(e)\n"6463"{\n"6464" var e = window.event || e;\n"6465" var delta = (e.wheelDelta || e.detail * (-120));\n"6466" ZoomGraph((-4 * delta / 120.0) | 0);\n"6467" Draw(1);\n"6468"}\n"6469"\n"6470"function ShowDetailedSearch(bShow)\n"6471"{\n"6472" if(bShow)\n"6473" {\n"6474" FilterInputSearch2.style[\'display\'] = \'block\';\n"6475" FilterInputSearch2.focus();\n"6476" FilterInputSearch2.select();\n"6477"\n"6478" }\n"6479" else\n"6480" {\n"6481" FilterInputSearch2.style[\'display\'] = \'none\';\n"6482" }\n"6483"}\n"6484"\n"6485"function ShowFilterInput(bShow)\n"6486"{\n"6487" if(bShow)\n"6488" {\n"6489" document.getElementById(\'filterinput\').style[\'display\'] = \'block\';\n"6490" }\n"6491" else\n"6492" {\n"6493" document.getElementById(\'filterinput\').style[\'display\'] = \'none\';\n"6494" }\n"6495"}\n"6496"\n"6497"function SetFilterInput(group, timer)\n"6498"{\n"6499" FilterInputGroupString = group;\n"6500" FilterInputTimerString = timer;\n"6501" FilterInputGroup.value = group?group:\'\';\n"6502" FilterInputTimer.value = timer?timer:\'\';\n"6503" FilterUpdate();\n"6504" if(group || timer)\n"6505" {\n"6506" ShowFilterInput(1);\n"6507" }\n"6508" else\n"6509" {\n"6510" ShowFilterInput(0);\n"6511" }\n"6512"\n"6513"}\n"6514"\n"6515"function ToggleFilterInput(escape)\n"6516"{\n"6517" var ActiveElement = -1;\n"6518" for(var i = 0; i < FilterInputArray.length; ++i)\n"6519" {\n"6520" if(FilterInputArray[i] == document.activeElement)\n"6521" {\n"6522" ActiveElement = i;\n"6523" }\n"6524" }\n"6525" var OldActiveElement = ActiveElement;\n"6526" if(ActiveElement >= 0)\n"6527" {\n"6528" FilterInputArray[ActiveElement].blur();\n"6529" }\n"6530" ActiveElement++;\n"6531" if(!escape)\n"6532" {\n"6533" if(ActiveElement < FilterInputArray.length)\n"6534" {\n"6535" ShowFilterInput(1);\n"6536" FilterInputArray[ActiveElement].focus();\n"6537" }\n"6538" }\n"6539" else\n"6540" {\n"6541" if(-1 == OldActiveElement)\n"6542" {\n"6543" SetFilterInput();\n"6544" }\n"6545" }\n"6546"}\n"6547"\n"6548"function KeyUp(evt)\n"6549"{\n"6550" //console.log(\"keyup \", evt.keyCode);\n"6551" if(evt.keyCode == 18)\n"6552" {\n"6553" ToolTipFlip = 0;\n"6554" }\n"6555" if(!FilterSearchActive && !IgnoreInput && SubMenuActive == -1)\n"6556" {\n"6557" if(evt.keyCode == 112)\n"6558" {\n"6559" ShowHelp(1, 0);\n"6560" }\n"6561" if(evt.keyCode == 39)\n"6562" {\n"6563" MoveToNext(1);\n"6564" }\n"6565" if(evt.keyCode == 37)\n"6566" {\n"6567" MoveToNext(-1);\n"6568" }\n"6569" if(evt.keyCode == 90)\n"6570" {\n"6571" ToolTipCorner = 1-ToolTipCorner;\n"6572" }\n"6573" if(evt.keyCode == 187)\n"6574" {\n"6575" DrawDetailedFlameMode = (DrawDetailedFlameMode+1) % 3;\n"6576" FilterSearchReset();\n"6577" }\n"6578" if(evt.keyCode == 189)\n"6579" {\n"6580" DrawDetailedCompareReverse = 1-DrawDetailedCompareReverse;\n"6581" FilterSearchReset();\n"6582" }\n"6583" if(evt.keyCode == 32)\n"6584" {\n"6585" if(RangeSelect.Begin < RangeSelect.End)\n"6586" {\n"6587" ZoomToRange(RangeSelect);\n"6588" RangeSelect = RangeInit();\n"6589" MouseHandleDragEnd();\n"6590" }\n"6591" }\n"6592" if(evt.keyCode == 192)\n"6593" {\n"6594" if(Mode == ModeDetailed)\n"6595" {\n"6596" ShowDetailedSearch(true);\n"6597" }\n"6598" else if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"6599" {\n"6600" ToggleFilterInput(0);\n"6601" evt.preventDefault();\n"6602" }\n"6603" }\n"6604" if(evt.keyCode == 9)\n"6605" {\n"6606" evt.preventDefault();\n"6607" if(Mode == ModeDetailed)\n"6608" {\n"6609" let Token = nHoverToken;\n"6610" if(Token == -1 && RangeValid(RangeSelect) && RangeSelect.Index >= 0)\n"6611" {\n"6612" Token = RangeSelect.Index;\n"6613" }\n"6614" if(Token != -1)\n"6615" {\n"6616" let Source = HoverTokenOwner ? HoverTokenOwner : S;\n"6617" if(Token < Source.TimerInfo.length)\n"6618" {\n"6619" let start = Source.TimerInfo[Token].worststart;\n"6620" let end = Source.TimerInfo[Token].worstend;\n"6621" RangeSelect.Begin = start;\n"6622" RangeSelect.End = end;\n"6623" RangeSelect.Thread = Source.TimerInfo[Token].worstthread;\n"6624" RangeSelect.Index = Token;\n"6625" RangeSelect.Second = Source == S2 ? 1 : 0;\n"6626" ShowFlashMessage(\'Worst: \' + (end-start).toFixed(2) + \'ms\', 100);\n"6627" let Offset = Source == S2 ? -fDetailedOffsetSecond : 0;\n"6628" MoveTo(RangeSelect.Begin + Offset, RangeSelect.End + Offset, ThreadYBegin[RangeSelect.Thread] + nOffsetY, ThreadYEnd[RangeSelect.Thread+1] + nOffsetY);\n"6629" MouseHandleDragEnd();\n"6630" }\n"6631" }\n"6632"\n"6633" }\n"6634" else if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"6635" {\n"6636" ToggleFilterInput(0);\n"6637" evt.preventDefault();\n"6638" }\n"6639"\n"6640" }\n"6641" if(evt.keyCode == 88)\n"6642" {\n"6643" ToggleMode();\n"6644" }\n"6645" if(evt.keyCode == 220 && Mode == ModeDetailed)\n"6646" {\n"6647" ToggleGroupColors(true);\n"6648" }\n"6649" if(evt.keyCode == 67 && Mode == ModeDetailed)\n"6650" {\n"6651" HideMode = HideMode == HideModeCollapsed ? HideModeFullyHidden : HideModeCollapsed;\n"6652" RequestRedraw();\n"6653" Invalidate = 0;\n"6654" }\n"6655" }\n"6656" if(evt.keyCode == 18)\n"6657" {\n"6658" KeyAltDown = 0;\n"6659" MouseDragKeyUp();\n"6660" }\n"6661" else if(evt.keyCode == 17)\n"6662" {\n"6663" KeyCtrlDown = 0;\n"6664" MouseDragKeyUp();\n"6665" }\n"6666" else if(evt.keyCode == 16)\n"6667" {\n"6668" KeyShiftDown = 0;\n"6669" MouseDragKeyUp();\n"6670" }\n"6671"\n"6672" if(evt.keyCode == 72)\n"6673" {\n"6674" KeyHDown = 0;\n"6675" RequestRedraw();\n"6676" }\n"6677"\n"6678"\n"6679" if(evt.keyCode == 27)\n"6680" {\n"6681" if(Mode == ModeDetailed)\n"6682" {\n"6683" let SearchString = FilterInputSearch2.value;\n"6684" if(document.activeElement == FilterInputSearch2)\n"6685" {\n"6686" document.activeElement.blur();\n"6687" if(!SearchString.length)\n"6688" ShowDetailedSearch(false);\n"6689" }\n"6690" else if(SearchString.length > 0)\n"6691" {\n"6692" //when search is active, esc clears in the following order:\n"6693" //focus from search\n"6694" //clears active range\n"6695" //clears search\n"6696" if(RangeValid(RangeSelect))\n"6697" {\n"6698" RangeSelect = RangeInit();\n"6699" }\n"6700" else\n"6701" {\n"6702" FilterInputSearch2.value = \"\";\n"6703" ShowDetailedSearch(false);\n"6704" }\n"6705" }\n"6706" else\n"6707" {\n"6708" RangeSelect = RangeInit();\n"6709" }\n"6710" }\n"6711"\n"6712" SortColumn = 0;\n"6713" SortColumnMouseOver = \"\";\n"6714" if(Mode == ModeTimers || Mode == ModeTimers_Threads || Mode == ModeTimers_Groups)\n"6715" {\n"6716" ToggleFilterInput(1);\n"6717" evt.preventDefault();\n"6718" }\n"6719" if(SubMenuActive != -1)\n"6720" {\n"6721" if(FilterInputMenu.value.trim() != \"\")\n"6722" {\n"6723" FilterInputMenu.value = \"\";\n"6724" }\n"6725" else\n"6726" {\n"6727" EnableMenu(-1);\n"6728" }\n"6729" }\n"6730"\n"6731" if(FilterSearchActive)\n"6732" {\n"6733" if(FilterInput.value != \'\')\n"6734" {\n"6735" FilterInput.value = \'\';\n"6736" }\n"6737" else\n"6738" {\n"6739" FilterInputHide();\n"6740" }\n"6741" }\n"6742" else\n"6743" {\n"6744" FilterSearchReset();\n"6745" }\n"6746" }\n"6747"\n"6748"\n"6749" if(evt.keyCode == 13 && !IgnoreInput)\n"6750" {\n"6751" if(FilterSearchActive)\n"6752" {\n"6753" FilterInputCommit();\n"6754" }\n"6755" else\n"6756" {\n"6757" FilterInputShow();\n"6758" }\n"6759" }\n"6760" RequestRedraw();\n"6761" Invalidate = 0;\n"6762"}\n"6763"function FilterInputUpdate()\n"6764"{\n"6765" Invalidate = 0;\n"6766" if(FilterSearchActive == 1)\n"6767" {\n"6768" FilterInputDiv.style[\'display\'] = \'inline\';\n"6769" FilterInput.focus();\n"6770" }\n"6771" else\n"6772" {\n"6773" FilterSearchSelection = -1;\n"6774" FilterInputDiv.style[\'display\'] = \'none\';\n"6775" }\n"6776"}\n"6777"function FilterInputShow()\n"6778"{\n"6779" // FilterSearchActive = 1;\n"6780" // FilterInputUpdate();\n"6781" // RequestRedraw();\n"6782"}\n"6783"function FilterInputHide()\n"6784"{\n"6785" FilterSearchActive = 0;\n"6786" FilterInputUpdate();\n"6787"}\n"6788"\n"6789"function FilterInputCommit()\n"6790"{\n"6791" if(FilterSearchSelection >= 0)\n"6792" {\n"6793" FilterSearchReset();\n"6794" FilterSearchPassIndex = FilterSearchSelection;\n"6795" FilterSearchStartTime = new Date();\n"6796" }\n"6797" FilterInputHide();\n"6798"}\n"6799"function FilterSearchReset()\n"6800"{\n"6801" FilterSearchArray = new Array();\n"6802"}\n"6803"function CreateFilter(Filter)\n"6804"{\n"6805" if(!Filter || Filter.length == 0)\n"6806" {\n"6807" return null;\n"6808" }\n"6809" Filter = Filter.split(\' \');\n"6810"\n"6811" var regexp = \"\";\n"6812" for(var i = 0; i < Filter.length; ++i)\n"6813" {\n"6814" regexp = regexp + \".*\" + Filter[i];\n"6815" }\n"6816" Filter = new Array();\n"6817" regexp = regexp + \".*\";\n"6818" Filter.push(new RegExp(regexp, \"i\"));\n"6819" return Filter;\n"6820"}\n"6821"function FilterKeyUp()\n"6822"{\n"6823" FilterInputTimerString = FilterInputTimer.value;\n"6824" FilterInputGroupString = FilterInputGroup.value;\n"6825" FilterUpdate();\n"6826"}\n"6827"\n"6828"function FilterUpdate()\n"6829"{\n"6830" FilterTimer = CreateFilter(FilterInputTimerString);\n"6831" FilterGroup = CreateFilter(FilterInputGroupString);\n"6832"}\n"6833"\n"6834"function KeyDown(evt)\n"6835"{\n"6836" //console.log(\"keydown \", evt.keyCode);\n"6837" if(evt.keyCode == 18)\n"6838" {\n"6839" KeyAltDown = 1;\n"6840" }\n"6841" else if(evt.keyCode == 17)\n"6842" {\n"6843" KeyCtrlDown = 1;\n"6844" }\n"6845" else if(evt.keyCode == 16)\n"6846" {\n"6847" KeyShiftDown = 1;\n"6848" }\n"6849" else if(evt.keyCode == 9)\n"6850" {\n"6851" evt.preventDefault();\n"6852" }\n"6853" else if(evt.keyCode == 13)\n"6854" {\n"6855" evt.preventDefault();\n"6856" }\n"6857" else if(evt.keyCode == 91) // z/tab to toggle tooltip\n"6858" {\n"6859" ToolTipFlip = 1;\n"6860" }\n"6861" else if(evt.keyCode == 70)\n"6862" {\n"6863" if(evt.ctrlKey)\n"6864" {\n"6865" evt.preventDefault();\n"6866" if(Mode == ModeDetailed)\n"6867" ShowDetailedSearch(true);\n"6868" }\n"6869" }else if(evt.keyCode == 72)\n"6870" {\n"6871" KeyHDown = 1;\n"6872" RequestRedraw();\n"6873" }\n"6874"\n"6875"\n"6876" Invalidate = 0;\n"6877"}\n"6878"function ParseCookie(str)\n"6879"{\n"6880" if(!str) return null;\n"6881" var result = str.match(/fisk=([^;]+)/);\n"6882" // console.log(\"cookie is \" + str);\n"6883" if(result && result.length > 0)\n"6884" {\n"6885" var Obj = JSON.parse(result[1]);\n"6886" if(!Obj.offline)\n"6887" {\n"6888" var C = {};\n"6889" C.offline = Obj;\n"6890" Obj = C;\n"6891" }\n"6892" return Obj;\n"6893" }\n"6894" return null;\n"6895"}\n"6896"\n"6897"function GetCookie()\n"6898"{\n"6899" var Obj = ParseCookie(localStorage.getItem(\"microprofile_fisk\"));\n"6900" if(!Obj)\n"6901" {\n"6902" Obj = ParseCookie(document.cookie);\n"6903" }\n"6904" if(!Obj)\n"6905" {\n"6906" return {offline:{},live:{}};\n"6907" }\n"6908" return Obj;\n"6909"}\n"6910"\n"6911"function ReadCookie()\n"6912"{\n"6913" var C = GetCookie();\n"6914" var NewMode = ModeDetailed;\n"6915" if(C.offline)\n"6916" {\n"6917" var Obj = C.offline;\n"6918" if(Obj.Mode)\n"6919" {\n"6920" NewMode = Obj.ModeX;\n"6921" }\n"6922" if(Obj.ReferenceTimeString)\n"6923" {\n"6924" ReferenceTimeString = Obj.ReferenceTimeString;\n"6925" }\n"6926" if(Obj.TargetTimeString)\n"6927" {\n"6928" TargetTimeString = Obj.TargetTimeString;\n"6929" }\n"6930" if(Obj.ThreadsHidden)\n"6931" {\n"6932" ThreadsHidden = Obj.ThreadsHidden;\n"6933" }\n"6934" if(Obj.GroupsAllActive || Obj.GroupsAllActive == 0 || Obj.GroupsAllActive)\n"6935" {\n"6936" GroupsAllActive = Obj.GroupsAllActive;\n"6937" }\n"6938" else\n"6939" {\n"6940" GroupsAllActive = 1;\n"6941" }\n"6942" if(Obj.GroupsDisabled)\n"6943" {\n"6944" GroupsDisabled = Obj.GroupsDisabled;\n"6945" }\n"6946" if(Obj.nContextSwitchEnabled)\n"6947" {\n"6948" nContextSwitchEnabled = Obj.nContextSwitchEnabled;\n"6949" }\n"6950" else\n"6951" {\n"6952" nContextSwitchEnabled = 1;\n"6953" }\n"6954" if(Obj.GroupColors)\n"6955" {\n"6956" GroupColors = Obj.GroupColors;\n"6957" }\n"6958" else\n"6959" {\n"6960" GroupColors = 0;\n"6961" }\n"6962" if(Obj.nHideHelp)\n"6963" {\n"6964" nHideHelp = 1;\n"6965" }\n"6966" if(Obj.ColumnsEnabled)\n"6967" {\n"6968" ColumnsEnabled = Obj.ColumnsEnabled;\n"6969" }\n"6970" if(Obj.ToolTipCorner)\n"6971" {\n"6972" ToolTipCorner = Obj.ToolTipCorner;\n"6973" }\n"6974" if(Obj.DrawDetailedFlameMode)\n"6975" {\n"6976" DrawDetailedFlameMode = Obj.DrawDetailedFlameMode;\n"6977" }\n"6978" if(Obj.DrawDetailedCompareReverse)\n"6979" {\n"6980" DrawDetailedCompareReverse = Obj.DrawDetailedCompareReverse;\n"6981" }\n"6982" if(Obj.ThreadOrderNames)\n"6983" {\n"6984" ThreadOrderNames = Obj.ThreadOrderNames;\n"6985" }\n"6986" if(Obj.ThreadLogAutoHide)\n"6987" {\n"6988" ThreadLogAutoHide = Obj.ThreadLogAutoHide;\n"6989" }\n"6990" if(Obj.DrawDetailedNewDraw)\n"6991" {\n"6992" DrawDetailedNewDraw = Obj.DrawDetailedNewDraw;\n"6993" }\n"6994"\n"6995" }\n"6996" SetContextSwitch(nContextSwitchEnabled);\n"6997" SetMode(NewMode);\n"6998" SetReferenceTime(ReferenceTimeString);\n"6999" SetTargetTime(TargetTimeString);\n"7000" UpdateGroupColors();\n"7001" UpdateThreadLogAutoHide();\n"7002"}\n"7003"function WriteCookie()\n"7004"{\n"7005" var C = GetCookie();\n"7006" var Obj = new Object();\n"7007" Obj.ModeX = Mode;\n"7008" Obj.ReferenceTimeString = ReferenceTimeString;\n"7009" Obj.TargetTimeString = TargetTimeString;\n"7010" Obj.ThreadsHidden = ThreadsHidden;\n"7011" Obj.GroupsDisabled = GroupsDisabled;\n"7012" Obj.GroupsAllActive = GroupsAllActive;\n"7013" Obj.nContextSwitchEnabled = nContextSwitchEnabled;\n"7014" Obj.GroupColors = GroupColors;\n"7015" Obj.ColumnsEnabled = ColumnsEnabled;\n"7016" Obj.ToolTipCorner = ToolTipCorner;\n"7017" Obj.DrawDetailedFlameMode = DrawDetailedFlameMode;\n"7018" Obj.DrawDetailedCompareReverse = DrawDetailedCompareReverse;\n"7019" Obj.ThreadOrderNames = ThreadOrderNames;\n"7020" Obj.ThreadLogAutoHide = ThreadLogAutoHide;\n"7021" Obj.DrawDetailedNewDraw = DrawDetailedNewDraw;\n"7022" if(nHideHelp)\n"7023" {\n"7024" Obj.nHideHelp = 1;\n"7025" }\n"7026" C.offline = Obj;\n"7027" var date = new Date();\n"7028" date.setFullYear(2099);\n"7029" var cookie = \'fisk=\' + JSON.stringify(C) + \';expires=\' + date;\n"7030" document.cookie = cookie;\n"7031" localStorage.setItem(\"microprofile_fisk\", cookie);\n"7032"}\n"7033"\n"7034"function WindowRect(x,y,w,h)\n"7035"{\n"7036" var s = {};\n"7037" s.x = x;\n"7038" s.y = y;\n"7039" s.w = w;\n"7040" s.h = h;\n"7041" return s;\n"7042"}\n"7043"\n"7044"function MenuSize(w)\n"7045"{\n"7046" return WindowRect(nWidth / 2 - w / 2, 5, w, nHeight);\n"7047"}\n"7048"\n"7049"function TimerMenuSize()\n"7050"{\n"7051" return MenuSize(200 + 5 + FontWidth); //fix menu size\n"7052"}\n"7053"\n"7054"function DrawFilterSearch()\n"7055"{\n"7056" FilterSearchSelection = -1;\n"7057" FilterSearchPassIndex = -1;\n"7058" FilterSearchSelectionMax = 0;\n"7059" if(!FilterSearchActive)\n"7060" return;\n"7061" nHoverToken = -1;\n"7062"\n"7063" if(FilterInputSearchLast != FilterInput.value)\n"7064" {\n"7065" nOffsetFilterSearch = 0;\n"7066" }\n"7067" FilterInputSearchLast = FilterInput.value;\n"7068"\n"7069" var FilterArray = CreateFilter(FilterInput.value);\n"7070" var context = CanvasDetailedView.getContext(\'2d\');\n"7071" var nColorIndex = 0;\n"7072" var SizeInfo = TimerMenuSize();\n"7073" var Y = SizeInfo.y;\n"7074" var Width = S.TimerNameWidth + S.GroupNameWidth;\n"7075" SizeInfo.w = Width;\n"7076" var X = SizeInfo.x;\n"7077"\n"7078" MoveFilterInputDiv(SizeInfo.x, SizeInfo.y, SizeInfo.w);\n"7079" var YStart = Y;\n"7080" Y += 35; //todo: measure somehow?\n"7081" var MouseX = DetailedViewMouseX;\n"7082" var MouseY = DetailedViewMouseY;\n"7083"\n"7084" Y -= nOffsetFilterSearch;\n"7085" var Count = 0;\n"7086" for(var i = 0; i < S.TimerInfo.length; ++i)\n"7087" {\n"7088" var v = S.TimerInfo[i];\n"7089" {\n"7090" var Name = v.name;\n"7091" var ParentName = S.GroupInfo[v.group].name;\n"7092" if(FilterMatch(FilterArray, ParentName + \" \" + Name))\n"7093" {\n"7094" if(Y >= YStart)\n"7095" {\n"7096" Count++;\n"7097" var ParentName = S.GroupInfo[v.group].name;\n"7098" var ParentColor = \'white\';\n"7099" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"7100" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"7101" var TextY = Y+BoxHeight-FontAscent;\n"7102" context.fillStyle = bgcolor;\n"7103" context.fillRect(X, Y, Width, BoxHeight);\n"7104" context.fillStyle = ParentColor;\n"7105" context.fillText(ParentName, X + 2, TextY);\n"7106" context.fillStyle = g_Colors[v.cid];\n"7107" context.textAlign = \'right\';\n"7108" context.fillText(Name, X + Width - 2, TextY);\n"7109" context.textAlign = \'left\';\n"7110" if(bMouseIn)\n"7111" {\n"7112" FilterSearchSelection = i;\n"7113" }\n"7114" }\n"7115" Y += BoxHeight;\n"7116" if(Y > nHeight)\n"7117" break;\n"7118" nColorIndex = 1-nColorIndex;\n"7119" }\n"7120" }\n"7121" }\n"7122" FilterSearchSelectionMax = Count;\n"7123" SizeInfo.h = Y-SizeInfo.y;\n"7124" RequestRedraw();\n"7125" return SizeInfo;\n"7126"}\n"7127"\n"7128"function CalcAverage()\n"7129"{\n"7130" var Sum = 0;\n"7131" var Count = 0;\n"7132" for(nLog = 0; nLog < nNumLogs; nLog++)\n"7133" {\n"7134" StackPos = 0;\n"7135" for(var i = 0; i < S.Frames.length; i++)\n"7136" {\n"7137" var Frame_ = S.Frames[i];\n"7138" var tt = Frame_.tt[nLog];\n"7139" var ts = Frame_.ts[nLog];\n"7140"\n"7141" var count = tt.length;\n"7142" for(var j = 0; j < count; j++)\n"7143" {\n"7144" var type ";71457146const size_t g_MicroProfileHtml_end_4_size = sizeof(g_MicroProfileHtml_end_4);7147const char g_MicroProfileHtml_end_5[] =7148"= tt[j];\n"7149" var time = ts[j];\n"7150" if(type == 1)\n"7151" {\n"7152" Stack[StackPos] = time;//store the frame which it comes from\n"7153" StackPos++;\n"7154" }\n"7155" else if(type == 0)\n"7156" {\n"7157" if(StackPos>0)\n"7158" {\n"7159"\n"7160" StackPos--;\n"7161" var localtime = time - Stack[StackPos];\n"7162" Count++;\n"7163" Sum += localtime;\n"7164" }\n"7165" }\n"7166" }\n"7167" }\n"7168" }\n"7169" return Sum / Count;\n"7170"\n"7171"}\n"7172"\n"7173"function CheckExtType(value, Checked)\n"7174"{\n"7175" if((value&3) != 3)\n"7176" return false;\n"7177" return (value >> 2) == Checked;\n"7178"\n"7179"}\n"7180"\n"7181"function MakeLod(index, MinDelta, TimeArray, TypeArray, IndexArray, LogStart)\n"7182"{\n"7183" if(S.LodData[index])\n"7184" {\n"7185" console.log(\"error!!\");\n"7186" }\n"7187" var o = new Object();\n"7188" o.MinDelta = MinDelta;\n"7189" o.TimeArray = TimeArray;\n"7190" o.TypeArray = TypeArray;\n"7191" o.IndexArray = IndexArray;\n"7192" o.LogStart = LogStart;\n"7193" S.LodData[index] = o;\n"7194"}\n"7195"\n"7196"function PreprocessBuildSplitArray()\n"7197"{\n"7198" var nNumLogs = S.Frames[0].ts.length;\n"7199"\n"7200" ProfileEnter(\"PreprocessBuildSplitArray\");\n"7201" var SplitArrays = new Array(nNumLogs);\n"7202"\n"7203" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"7204" {\n"7205" console.log(\"source log \" + nLog + \" size \" + S.LodData[0].TypeArray[nLog].length);\n"7206" }\n"7207"\n"7208"\n"7209" for(nLog = 0; nLog < nNumLogs; nLog++)\n"7210" {\n"7211" var MaxDepth = 1;\n"7212" var StackPos = 0;\n"7213" var Stack = Array(20);\n"7214" var TypeArray = S.LodData[0].TypeArray[nLog];\n"7215" var TimeArray = S.LodData[0].TimeArray[nLog];\n"7216" var DeltaTimes = new Array(TypeArray.length);\n"7217"\n"7218" for(var j = 0; j < TypeArray.length; ++j)\n"7219" {\n"7220" var type = TypeArray[j];\n"7221" var time = TimeArray[j];\n"7222" if(type == 1)\n"7223" {\n"7224" //push\n"7225" Stack[StackPos] = time;\n"7226" StackPos++;\n"7227" }\n"7228" else if(type == 0)\n"7229" {\n"7230" if(StackPos>0)\n"7231" {\n"7232" StackPos--;\n"7233" DeltaTimes[j] = time - Stack[StackPos];\n"7234" }\n"7235" else\n"7236" {\n"7237" DeltaTimes[j] = 0;\n"7238" }\n"7239" }\n"7240" }\n"7241" DeltaTimes.sort(function(a,b){return b-a;});\n"7242" var SplitArray = Array(NumLodSplits);\n"7243" var SplitIndex = DeltaTimes.length;\n"7244"\n"7245" var j = 0;\n"7246" for(j = 0; j < NumLodSplits; ++j)\n"7247" {\n"7248" SplitIndex = Math.floor(SplitIndex / 2);\n"7249" while(SplitIndex > 0 && !DeltaTimes[SplitIndex])\n"7250" {\n"7251" SplitIndex--;\n"7252" }\n"7253" if(SplitIndex < SplitMin)\n"7254" {\n"7255" break;\n"7256" }\n"7257" //search.. if 0\n"7258" var SplitTime = DeltaTimes[SplitIndex];\n"7259" if(SplitTime>=0)\n"7260" {\n"7261" SplitArray[j] = SplitTime;\n"7262" }\n"7263" else\n"7264" {\n"7265" SplitArray[j] = SPLIT_LIMIT;\n"7266" }\n"7267" if(j>0)\n"7268" {\n"7269" console.assert(SplitArray[j-1] <= SplitArray[j], \"must be less\");\n"7270" }\n"7271"\n"7272" }\n"7273" for(; j < NumLodSplits; ++j)\n"7274" {\n"7275" SplitArray[j] = SPLIT_LIMIT;\n"7276" }\n"7277"\n"7278"\n"7279" SplitArrays[nLog] = SplitArray;\n"7280" }\n"7281" ProfileLeave();\n"7282" return SplitArrays;\n"7283"}\n"7284"\n"7285"function PreprocessBuildDurationArray()\n"7286"{\n"7287" var nNumLogs = S.Frames[0].ts.length;\n"7288" ProfileEnter(\"PreprocessBuildDurationArray\");\n"7289" var DurationArrays = new Array(nNumLogs);\n"7290" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"7291" {\n"7292" var MaxDepth = 1;\n"7293" var StackPos = 0;\n"7294" var Stack = Array(20);\n"7295" var StackIndex = Array(20);\n"7296" var TypeArray = S.LodData[0].TypeArray[nLog];\n"7297" var TimeArray = S.LodData[0].TimeArray[nLog];\n"7298" var DurationArray = Array(S.LodData[0].TypeArray[nLog].length);\n"7299" for(var j = 0; j < TypeArray.length; ++j)\n"7300" {\n"7301" var type = TypeArray[j];\n"7302" var time = TimeArray[j];\n"7303" if(type == 1)\n"7304" {\n"7305" //push\n"7306" Stack[StackPos] = time;\n"7307" StackIndex[StackPos] = j;\n"7308" StackPos++;\n"7309" }\n"7310" else if(type == 0)\n"7311" {\n"7312" if(StackPos>0)\n"7313" {\n"7314" StackPos--;\n"7315" var Duration = time - Stack[StackPos];\n"7316" DurationArray[StackIndex[StackPos]] = Duration;\n"7317" DurationArray[j] = Duration;\n"7318" }\n"7319" else\n"7320" {\n"7321" DurationArray[j] = 0;\n"7322" }\n"7323" }\n"7324" }\n"7325" for(var j = 0; j < StackPos; ++j)\n"7326" {\n"7327" DurationArray[j] = 0;\n"7328" }\n"7329" DurationArrays[nLog] = DurationArray;\n"7330" }\n"7331" ProfileLeave();\n"7332" return DurationArrays;\n"7333"\n"7334"}\n"7335"function PreprocessLods()\n"7336"{\n"7337" ProfileEnter(\"PreprocessLods\");\n"7338" var nNumLogs = S.Frames[0].ts.length;\n"7339" var SplitArrays = PreprocessBuildSplitArray();\n"7340" var DurationArrays = PreprocessBuildDurationArray();\n"7341" var Source = S.LodData[0];\n"7342" var SourceLogStart = Source.LogStart;\n"7343" var NumFrames = SourceLogStart.length;\n"7344"\n"7345" for(var i = 0; i < NumLodSplits-1; ++i)\n"7346" {\n"7347" var DestLogStart = Array(SourceLogStart.length);\n"7348" for(var j = 0; j < DestLogStart.length; ++j)\n"7349" {\n"7350" DestLogStart[j] = Array(nNumLogs);\n"7351" }\n"7352" var MinDelta = Array(nNumLogs);\n"7353" var TimeArray = Array(nNumLogs);\n"7354" var IndexArray = Array(nNumLogs);\n"7355" var TypeArray = Array(nNumLogs);\n"7356"\n"7357"\n"7358"\n"7359" for(nLog = 0; nLog < nNumLogs; ++nLog)\n"7360" {\n"7361" var SourceTypeArray = Source.TypeArray[nLog];\n"7362" var SourceTimeArray = Source.TimeArray[nLog];\n"7363" var SourceIndexArray = Source.IndexArray[nLog];\n"7364" var Duration = DurationArrays[nLog];\n"7365" console.assert(Duration.length == SourceTypeArray.length, \"must be equal!\");\n"7366" var SplitTime = SplitArrays[nLog][i];\n"7367"\n"7368" MinDelta[nLog] = SplitTime;\n"7369" if(SplitTime < SPLIT_LIMIT)\n"7370" {\n"7371" var SourceCount = SourceTypeArray.length;\n"7372" var DestTypeArray = Array();\n"7373" var DestTimeArray = Array();\n"7374" var DestIndexArray = Array();\n"7375" var RemapArray = Array(SourceCount);\n"7376" var DiscardLast = 0;\n"7377"\n"7378" for(var j = 0; j < SourceCount; ++j)\n"7379" {\n"7380" RemapArray[j] = DestTypeArray.length;\n"7381" if(Duration[j] >= SplitTime || ((SourceTypeArray[j]&3) == 3 && 0 == DiscardLast))\n"7382" {\n"7383" DiscardLast = 0;\n"7384" DestTypeArray.push(SourceTypeArray[j]);\n"7385" DestTimeArray.push(SourceTimeArray[j]);\n"7386" DestIndexArray.push(SourceIndexArray[j]);\n"7387" }\n"7388" else\n"7389" {\n"7390" DiscardLast = 1;\n"7391" }\n"7392" }\n"7393" TimeArray[nLog] = DestTimeArray;\n"7394" IndexArray[nLog] = DestIndexArray;\n"7395" TypeArray[nLog] = DestTypeArray;\n"7396" for(var j = 0; j < NumFrames; ++j)\n"7397" {\n"7398" var OldStart = SourceLogStart[j][nLog];\n"7399" var NewStart = RemapArray[OldStart];\n"7400" var FrameArray = DestLogStart[j];\n"7401" FrameArray[nLog] = NewStart;\n"7402" }\n"7403" }\n"7404" else\n"7405" {\n"7406"\n"7407" for(var j = 0; j < NumFrames; ++j)\n"7408" {\n"7409" var FrameArray = DestLogStart[j];\n"7410"\n"7411" FrameArray[nLog] = 0;\n"7412" }\n"7413"\n"7414" }\n"7415"\n"7416" }\n"7417" MakeLod(i+1, MinDelta, TimeArray, TypeArray, IndexArray, DestLogStart);\n"7418" }\n"7419" ProfileLeave();\n"7420"}\n"7421"\n"7422"\n"7423"function HistogramCreate(MaxTime)\n"7424"{\n"7425" let Histogram = new Object();\n"7426" Histogram.MaxTime = MaxTime;\n"7427" Histogram.MaxOccurence = 0;\n"7428" Histogram.Occurences = new Uint32Array(100);\n"7429" return Histogram;\n"7430"}\n"7431"function HistogramAdd(Histogram, Value)\n"7432"{\n"7433" if(Value > Histogram.MaxTime)\n"7434" debugger;\n"7435" let Index = Math.floor(Value / Histogram.MaxTime);\n"7436" Index = Math.max(0, Math.min(99, Index));\n"7437" Occurrences[Index]++;\n"7438" Histogram.MaxOccurence = Math.max(Histogram.MaxOccurence, Occurrences[Index]);\n"7439"\n"7440"}\n"7441"\n"7442"function PreprocessLogBarArray()\n"7443"{\n"7444" ProfileEnter(\"PreprocessLogBarArray\");\n"7445"\n"7446" let NumLogs = S.NumLogs;\n"7447" let Stack = Array(20);\n"7448"\n"7449" let LogRows = new Array(NumLogs);\n"7450" S.LogRows = LogRows;\n"7451"\n"7452" for(let nLog = 0; nLog < NumLogs; nLog++)\n"7453" {\n"7454" let MaxStack = S.MaxStack[nLog];\n"7455" let SectionColorStack = new Array(MaxStack);\n"7456" SectionColorStack[0] = CIDFail;\n"7457" let StackPos = 0;\n"7458" let SectionColorStackPos = 1;\n"7459"\n"7460" let Rows = new Array(MaxStack);\n"7461" LogRows[nLog] = Rows;\n"7462" for(let i = 0; i < MaxStack; ++i)\n"7463" {\n"7464" Row = new Object();\n"7465" //Note; This has always got implied begin / end tied together\n"7466" Row.Offset = i;\n"7467" Row.Tree = new Array()\n"7468" Row.Tree[0] = new Object();\n"7469" Row.Tree[0].Source = new Array();\n"7470" Row.Tree[0].Index_ = new Array();\n"7471" Row.Tree[0].ColorIds_ = new Array();\n"7472" Row.Tree[0].Begin_ = new Array();\n"7473" Row.Tree[0].Duration_ = new Array();\n"7474" Row.Tree[0].MaxDuration_ = new Array();\n"7475" Row.Tree[0].SumDuration_ = new Array();\n"7476" Row.Tree[0].SectionColor_ = new Array();\n"7477" Row.Tree[0].Parent_ = -1;\n"7478" Row.Tree[0].Tail = 0;\n"7479" Row.Tree[0].Length = 0;\n"7480"\n"7481" Rows[i] = Row;\n"7482" }\n"7483" let RootSectionColor = CIDFail;\n"7484"\n"7485" let SrcTypeArray = S.TypeArray[nLog];\n"7486" let SrcTimeArray = S.TimeArray[nLog];\n"7487" let SrcIndexArray = S.IndexArray[nLog];\n"7488" let len = SrcTypeArray.length;\n"7489"\n"7490" for(let i = 0; i < len; ++i)\n"7491" {\n"7492" let type = SrcTypeArray[i];\n"7493" let time = SrcTimeArray[i];\n"7494" let index = SrcIndexArray[i];\n"7495" let skipsection = false;\n"7496"\n"7497" let TimerInfo = type < 2 ? S.TimerInfo[index] : null;\n"7498" if(type == 1)\n"7499" {\n"7500" let IsSection = TimerInfo.flags & FLAGS_SECTION;\n"7501" if(IsSection)\n"7502" {\n"7503" SectionColorStack[SectionColorStackPos] = TimerInfo.cid;\n"7504" SectionColorStackPos++;\n"7505" }\n"7506" if(!IsSection)\n"7507" {\n"7508" Stack[StackPos] = i;\n"7509" StackPos++;\n"7510" }\n"7511"\n"7512" }\n"7513" else if(type == 0)\n"7514" {\n"7515" let IsSection = TimerInfo.flags & FLAGS_SECTION; \n"7516" if(IsSection)\n"7517" {\n"7518" if(SectionColorStackPos > 1)\n"7519" {\n"7520" SectionColorStackPos--;\n"7521" }\n"7522" else\n"7523" {\n"7524" //debugger;\n"7525" // Hitting a close, without a start. tag all previously untagged to belong to this section.\n"7526" for(let i = 0; i < MaxStack; ++i)\n"7527" {\n"7528" let sc = Rows[i].Tree[0].SectionColor_;\n"7529" for(let j = 0; j < sc.length; ++j)\n"7530" {\n"7531" if(sc[j] == CIDFail)\n"7532" {\n"7533" sc[j] = TimerInfo.cid;\n"7534" }\n"7535" }\n"7536" }\n"7537"\n"7538" }\n"7539"\n"7540" }\n"7541" if(!IsSection && StackPos > 0)\n"7542" {\n"7543" StackPos--;\n"7544" let stackindex = Stack[StackPos];\n"7545" let sectioncolor = SectionColorStack[SectionColorStackPos-1];\n"7546" let begintype = SrcTypeArray[stackindex];\n"7547" let begintime = SrcTimeArray[stackindex];\n"7548" let beginindex = SrcIndexArray[stackindex];\n"7549"\n"7550" if(type != 0)\n"7551" debugger;\n"7552" if(begintype != 1)\n"7553" debugger;\n"7554" if(index != beginindex)\n"7555" debugger;\n"7556" if(StackPos >= MaxStack || StackPos < 0)\n"7557" debugger;\n"7558" let rt0 = Rows[StackPos].Tree[0];\n"7559" rt0.Source.push(i);\n"7560" rt0.Index_.push(beginindex);\n"7561" rt0.ColorIds_.push(S.TimerInfo[beginindex].cid);\n"7562" rt0.Begin_.push(begintime);\n"7563" let Duration = time - begintime;\n"7564" rt0.Duration_.push(Duration);\n"7565" rt0.SumDuration_.push(Duration);\n"7566" rt0.MaxDuration_.push(Duration);\n"7567" rt0.SectionColor_.push(sectioncolor);\n"7568" if(CheckExtType(SrcTypeArray[stackindex+1],ETOKEN_GPU_CPU_TIMESTAMP)) // (SrcTypeArray[stackindex+1]&3) == 3) // this is a gpu log with a cpu marker appended\n"7569" {\n"7570" //if((SrcTypeArray[stackindex+2]&3) != 3)\n"7571" if(!CheckExtType(SrcTypeArray[stackindex+2], ETOKEN_GPU_CPU_SOURCE_THREAD))\n"7572" debugger; //should be matching triplets\n"7573"\n"7574" if(!CheckExtType(SrcTypeArray[i+1], ETOKEN_GPU_CPU_TIMESTAMP))\n"7575" debugger; //should be matching pairs\n"7576"\n"7577" let CustomToken1 = SrcTypeArray[stackindex+1] >> 2;\n"7578" let CustomToken2 = SrcTypeArray[stackindex+2] >> 2;\n"7579" \n"7580" if(CustomToken1 != ETOKEN_GPU_CPU_TIMESTAMP)\n"7581" debugger;\n"7582" if(CustomToken2 != ETOKEN_GPU_CPU_SOURCE_THREAD)\n"7583" debugger;\n"7584"\n"7585"\n"7586" let CpuBegin = SrcTimeArray[stackindex+1];\n"7587" let CpuEnd = SrcTimeArray[i+1];\n"7588" let Thread = SrcIndexArray[stackindex+2];\n"7589" if(!rt0.CpuDuration) //only there for gpu logs, so created on demand\n"7590" {\n"7591" rt0.CpuBegin = new Array();\n"7592" rt0.CpuDuration = new Array();\n"7593" rt0.CpuThread = new Array();\n"7594" for(let j = 0; j < rt0.Length; ++j)\n"7595" {\n"7596" rt0.CpuBegin.push(0);\n"7597" rt0.CpuDuration.push(0);\n"7598" rt0.CpuThread.push(0);\n"7599" }\n"7600" }\n"7601" rt0.CpuBegin.push(CpuBegin);\n"7602" rt0.CpuDuration.push(CpuEnd - CpuBegin);\n"7603" rt0.CpuThread.push(Thread);\n"7604" }\n"7605" else if(rt0.CpuDuration)\n"7606" {\n"7607" rt0.CpuBegin.push(0);\n"7608" rt0.CpuDuration.push(0);\n"7609" rt0.CpuThread.push(0);\n"7610" }\n"7611"\n"7612" rt0.Length++;\n"7613" }\n"7614"\n"7615" }\n"7616" else if(type != 0)\n"7617" {\n"7618" }\n"7619" }\n"7620"\n"7621" for(let r = 0; r < Rows.length; ++r)\n"7622" {\n"7623" let Row = Rows[r];\n"7624" let RowTreeIndex = 0;\n"7625"\n"7626" Row.Tree[0].Index = new Int32Array(Row.Tree[0].Index_);\n"7627" Row.Tree[0].ColorIds = new Int32Array(Row.Tree[0].ColorIds_);// = new Array();\n"7628" Row.Tree[0].Begin = new Float32Array(Row.Tree[0].Begin_);\n"7629" Row.Tree[0].Duration = new Float32Array(Row.Tree[0].Duration_);\n"7630" Row.Tree[0].MaxDuration = new Float32Array(Row.Tree[0].MaxDuration_);\n"7631" Row.Tree[0].SumDuration = new Float32Array(Row.Tree[0].SumDuration_);\n"7632" Row.Tree[0].SectionColor = new Int32Array(Row.Tree[0].SectionColor_);\n"7633"\n"7634" // stop at 100 elements...\n"7635" while(Row.Tree[RowTreeIndex].Begin.length > 10)\n"7636" {\n"7637"\n"7638" //Use RowTreeIndex to build RowTreeIndex+1 with half as much data.\n"7639" let RowTreeLevelParent = Row.Tree[RowTreeIndex];\n"7640" let Size = Math.floor(RowTreeLevelParent.Index.length / 2);\n"7641" let Tail = RowTreeLevelParent.Index.length % 2;\n"7642" if(Size < 0)\n"7643" debugger;\n"7644"\n"7645" let RowTreeLevel = new Object();\n"7646" RowTreeLevel.Index = new Int32Array(Size);\n"7647" RowTreeLevel.ColorIds = new Int32Array(Size);\n"7648" RowTreeLevel.Begin = new Float32Array(Size);\n"7649" RowTreeLevel.Duration = new Float32Array(Size);\n"7650" RowTreeLevel.SumDuration = new Float32Array(Size);\n"7651" RowTreeLevel.MaxDuration = new Float32Array(Size);\n"7652" RowTreeLevel.SectionColor = new Int32Array(Size);\n"7653" RowTreeLevel.Parent = RowTreeIndex;\n"7654" RowTreeLevel.Tail = Tail;\n"7655" RowTreeLevel.Length = 0;\n"7656"\n"7657" for(let i = 0; i < Size; ++i)\n"7658" {\n"7659" let i0 = i * 2;\n"7660" let i1 = i0 + 1;\n"7661" //Should do fancy color merging, but hey just taking the color of the largest seems to work well enough.\n"7662" if(RowTreeLevelParent.MaxDuration[i1] > RowTreeLevelParent.MaxDuration[i0])\n"7663" {\n"7664" RowTreeLevel.Index[i] = i1;\n"7665" RowTreeLevel.ColorIds[i] = RowTreeLevelParent.ColorIds[i1];\n"7666" RowTreeLevel.MaxDuration[i] = RowTreeLevelParent.MaxDuration[i1];\n"7667" RowTreeLevel.SectionColor[i] = RowTreeLevelParent.SectionColor[i1];\n"7668" }\n"7669" else\n"7670" {\n"7671" RowTreeLevel.Index[i] = i0;\n"7672" RowTreeLevel.ColorIds[i] = RowTreeLevelParent.ColorIds[i0];\n"7673" RowTreeLevel.MaxDuration[i] = RowTreeLevelParent.MaxDuration[i0];\n"7674" RowTreeLevel.SectionColor[i] = RowTreeLevelParent.SectionColor[i0];\n"7675" }\n"7676" RowTreeLevel.SumDuration[i] = RowTreeLevelParent.SumDuration[i0] + RowTreeLevelParent.SumDuration[i1];\n"7677" RowTreeLevel.Begin[i] = RowTreeLevelParent.Begin[i0];\n"7678" RowTreeLevel.Duration[i] = RowTreeLevelParent.Begin[i1] - RowTreeLevelParent.Begin[i0] + RowTreeLevelParent.Duration[i1];\n"7679" RowTreeLevel.Length++;\n"7680" }\n"7681"\n"7682"\n"7683" if(Row.Tree.length != RowTreeIndex+1)\n"7684" debugger;\n"7685" Row.Tree.push(RowTreeLevel);\n"7686" Row.MaxTree = Row.Tree.length;\n"7687" RowTreeIndex++;\n"7688" }\n"7689" }\n"7690" }\n"7691" ProfileLeave();\n"7692"}\n"7693"\n"7694"function PreprocessGlobalArray()\n"7695"{\n"7696" ProfileEnter(\"PreprocessGlobalArray\");\n"7697" var nNumLogs = S.Frames[0].ts.length;\n"7698" var CaptureStart = S.Frames[0].framestart;\n"7699" var CaptureEnd = S.Frames[S.Frames.length-1].frameend;\n"7700" S.TypeArray = new Array(nNumLogs);\n"7701" S.TimeArray = new Array(nNumLogs);\n"7702" S.IndexArray = new Array(nNumLogs);\n"7703" S.NumLogs = nNumLogs;\n"7704" var LogStartArray = new Array(S.Frames.length);\n"7705" for(var i = 0; i < S.Frames.length; i++)\n"7706" {\n"7707" S.Frames[i].LogStart = new Array(nNumLogs);\n"7708" LogStartArray[i] = S.Frames[i].LogStart;\n"7709"\n"7710" S.Frames[i].LogEnd = new Array(nNumLogs);\n"7711" }\n"7712" var MinDelta = Array(nNumLogs);\n"7713" for(nLog = 0; nLog < nNumLogs; nLog++)\n"7714" {\n"7715" MinDelta[nLog] = 0;\n"7716" var Discard = 0;\n"7717" var TypeArray = new Array();\n"7718" var TimeArray = new Array();\n"7719" var IndexArray = new Array();\n"7720" for(var i = 0; i < S.Frames.length; i++)\n"7721" {\n"7722" var Frame_ = S.Frames[i];\n"7723" Frame_.LogStart[nLog] = TimeArray.length;\n"7724" var CanDiscard = !S.ISGPU[nLog] || Frame_.frameendgpu > 0; //in case of no reference, we cannot discard gpu markers. This happens when there is no gpu/cpu tick reference\n"7725"\n"7726" var FrameDiscard = (S.ISGPU[nLog] ? Frame_.frameendgpu : Frame_.frameend) + 33;//if timestamps are more than 33ms after current frame, we assume buffer has wrapped.\n"7727" var tt = Frame_.tt[nLog];\n"7728" var ts = Frame_.ts[nLog];\n"7729" var ti = Frame_.ti[nLog];\n"7730" var len = tt.length;\n"7731" var DiscardLast = 0;\n"7732" for(var xx = 0; xx < len; ++xx)\n"7733" {\n"7734" var Skip = (tt[i]&3 == 3) ? DiscardLast : (CanDiscard && ts[xx] > FrameDiscard);\n"7735" if(Skip)\n"7736" {\n"7737" Discard++;\n"7738" DiscardLast = 1;\n"7739" }\n"7740" else\n"7741" {\n"7742" DiscardLast = 0;\n"7743" TypeArray.push(tt[xx]);\n"7744" TimeArray.push(ts[xx]);\n"7745" IndexArray.push(ti[xx]);\n"7746" }\n"7747" }\n"7748" Frame_.LogEnd[nLog] = TimeArray.length;\n"7749" }\n"7750" S.TypeArray[nLog] = TypeArray;\n"7751" S.TimeArray[nLog] = TimeArray;\n"7752" S.IndexArray[nLog] = IndexArray;\n"7753" if(Discard)\n"7754" {\n"7755" console.log(\'discarded \' + Discard + \' markers from \' + S.ThreadNames[nLog]);\n"7756" }\n"7757" }\n"7758" MakeLod(0, MinDelta, S.TimeArray, S.TypeArray, S.IndexArray, LogStartArray);\n"7759" ProfileLeave();\n"7760"}\n"7761"\n"7762"function InitThreadLogAutoHidden()\n"7763"{\n"7764" let nNumLogs = S.Frames[0].ts.length;\n"7765" if(!S.ThreadLogAutoHidden)\n"7766" {\n"7767" S.ThreadLogAutoHidden = Array();\n"7768" }\n"7769" while(S.ThreadLogAutoHidden.length < nNumLogs)\n"7770" {\n"7771" S.ThreadLogAutoHidden.push(0);\n"7772" }\n"7773" if(!S.ThreadLogTypesUsed)\n"7774" {\n"7775" S.ThreadLogTypesUsed = Array();\n"7776" }\n"7777" while(S.ThreadLogTypesUsed.length < nNumLogs)\n"7778" {\n"7779" S.ThreadLogTypesUsed.push([]);\n"7780" }\n"7781"}\n"7782"\n"7783"function UpdateThreadLogAutoHide()\n"7784"{\n"7785" let AutoHide = ThreadLogAutoHide;\n"7786" let nNumLogs = S.Frames[0].ts.length;\n"7787" InitThreadLogAutoHidden();\n"7788" for(let nLog = 0; nLog < nNumLogs; ++nLog)\n"7789" {\n"7790" if(AutoHide)\n"7791" {\n"7792" let TypesUsed = S.ThreadLogTypesUsed[nLog];\n"7793" S.ThreadLogAutoHidden[nLog] = 1;\n"7794" for(let i = 0; i < TypesUsed.length; ++i)\n"7795" {\n"7796" if(TypesUsed[i])\n"7797" {\n"7798" S.ThreadLogAutoHidden[nLog] = 0;\n"7799" break;\n"7800" }\n"7801" }\n"7802" }\n"7803" else\n"7804" {\n"7805" S.ThreadLogAutoHidden[nLog] = 0;\n"7806" }\n"7807" console.log(\"AutoHide \", nLog, \" \", S.ThreadLogAutoHidden[nLog]);\n"7808" }\n"7809"}\n"7810"\n"7811"function PreprocessGatherLogTypes()\n"7812"{\n"7813" ProfileEnter(\"PreprocessGatherLogTypes\");\n"7814" let TimerCount = S.TimerInfo.length;\n"7815" let nNumLogs = S.Frames[0].ts.length;\n"7816" InitThreadLogAutoHidden();\n"7817" for(let nLog = 0; nLog < nNumLogs; nLog++)\n"7818" {\n"7819" S.ThreadLogAutoHidden[nLog] = 0;\n"7820" let TypesUsed = Array(TimerCount);\n"7821" for(let i = 0; i < TypesUsed.length; ++i)\n"7822" {\n"7823" TypesUsed[i] = 0;\n"7824" }\n"7825" for(let i = 0; i < S.Frames.length; i++)\n"7826" {\n"7827" let F = S.Frames[i];\n"7828" console.assert(F.tt.length == nNumLogs);\n"7829" let Data = F.ti[nLog];\n"7830" for(let j in Data)\n"7831" {\n"7832" let t = Data[j];\n"7833" console.assert(t < TimerCount);\n"7834" TypesUsed[t] = 1;\n"7835" }\n"7836" }\n"7837" S.ThreadLogTypesUsed[nLog] = TypesUsed;\n"7838" }\n"7839" ProfileLeave();\n"7840"}\n"7841"\n"7842"function PreprocessFindFirstFrames()\n"7843"{\n"7844" ProfileEnter(\"PreprocesFindFirstFrames\");\n"7845" //create arrays that show how far back we need to start search in order to get all markers.\n"7846" let nNumLogs = S.Frames[0].ts.length;\n"7847" for(let i = 0; i < S.Frames.length; i++)\n"7848" {\n"7849" S.Frames[i].FirstFrameIndex = new Array(nNumLogs);\n"7850" for(let j = 0; j < S.Frames[i].FirstFrameIndex.length; ++j)\n"7851" {\n"7852" S.Frames[i].FirstFrameIndex[j] = 0;\n"7853" }\n"7854" }\n"7855"\n"7856" let StackPos = 0;\n"7857" let Stack = Array(20);\n"7858" S.MaxStack = Array(nNumLogs);\n"7859"\n"7860" for(nLog = 0; nLog < nNumLogs; nLog++)\n"7861" {\n"7862" let MaxStack = 0;\n"7863" StackPos = 0;\n"7864" for(let i = 0; i < S.Frames.length; i++)\n"7865" {\n"7866" let Frame_ = S.Frames[i];\n"7867" let tt = Frame_.tt[nLog];\n"7868" let count = tt.length;\n"7869"\n"7870" let FirstFrame = i;\n"7871" if(StackPos>0)\n"7872" {\n"7873" FirstFrame = Stack[0];\n"7874" }\n"7875" S.Frames[i].FirstFrameIndex[nLog] = FirstFrame;\n"7876"\n"7877" for(let j = 0; j < count; j++)\n"7878" {\n"7879" let type = tt[j];\n"7880" if(type == 1)\n"7881" {\n"7882" Stack[StackPos] = i;//store the frame which it comes from\n"7883" StackPos++;\n"7884" if(StackPos > MaxStack)\n"7885" {\n"7886" MaxStack = StackPos;\n"7887" }\n"7888" }\n"7889" else if(type == 0)\n"7890" {\n"7891" if(StackPos>0)\n"7892" {\n"7893" StackPos--;\n"7894" }\n"7895" }\n"7896" }\n"7897" }\n"7898" S.MaxStack[nLog] = MaxStack;\n"7899" }\n"7900" S.MaxStack2 = Array(S.MaxStack.length);\n"7901" for(let i = 0; i < S.MaxStack2.length; ++i)\n"7902" S.MaxStack2[i] = 0;\n"7903" S.SecondActive = 0;\n"7904" ProfileLeave();\n"7905"}\n"7906"function PreprocessMeta()\n"7907"{\n"7908" return;\n"7909" MetaLengths = Array(MetaNames.length);\n"7910" MetaLengthsAvg = Array(MetaNames.length);\n"7911" MetaLengthsMax = Array(MetaNames.length);\n"7912" for(var i = 0; i < MetaNames.length; ++i)\n"7913" {\n"7914" MetaLengths[i] = MetaNames[i].length+1;\n"7915" MetaLengthsAvg[i] = MetaNames[i].length+5;\n"7916" MetaLengthsMax[i] = MetaNames[i].length+5;\n"7917" if(MetaLengths[i]<12)\n"7918" MetaLengths[i] = 12;\n"7919" if(MetaLengthsAvg[i]<12)\n"7920" MetaLengthsAvg[i] = 12;\n"7921" if(MetaLengthsMax[i]<12)\n"7922" MetaLengthsMax[i] = 12;\n"7923" }\n"7924" for(var i = 0; i < S.TimerInfo.length; ++i)\n"7925" {\n"7926" var Timer = S.TimerInfo[i];\n"7927" for(var j = 0; j < MetaNames.length; ++j)\n"7928" {\n"7929" var Len = FormatMeta(Timer.meta[j],0).length + 2;\n"7930" var LenAvg = FormatMeta(Timer.meta[j],2).length + 2;\n"7931" var LenMax = FormatMeta(Timer.meta[j],0).length + 2;\n"7932" if(Len > MetaLengths[j])\n"7933" {\n"7934" MetaLengths[j] = Len;\n"7935" }\n"7936" if(LenAvg > MetaLengthsAvg[j])\n"7937" {\n"7938" MetaLengthsAvg[j] = LenAvg;\n"7939" }\n"7940" if(LenMax > MetaLengthsMax[j])\n"7941" {\n"7942" MetaLengthsMax[j] = LenMax;\n"7943" }\n"7944" }\n"7945" }\n"7946"}\n"7947"\n"7948"function StringHash(s) //note: matching code in microprofile.cpp: uint32_t MicroProfileStringHash(const char* pString)\n"7949"{\n"7950" let h = 0xfeedba3e;\n"7951" for(let i = 0; i < s.length; ++i)\n"7952" {\n"7953" h = s.charCodeAt(i) + (h << 5) - h;\n"7954" h = h & h;\n"7955" }\n"7956" return Math.abs(h);\n"7957"}\n"7958"\n"7959"function StringColorIndex(Name)\n"7960"{\n"7961" let h = StringHash(Name);\n"7962" let cidx = Math.floor(360*(h / (1<<32-1)) );\n"7963" return cidx;\n"7964"}\n"7965"\n"7966"function ColorFromString(Name, S, L)\n"7967"{\n"7968" let H = StringColorIndex(Name);\n"7969" return \"hsl(\" + H + \",\" + S + \"%, \" + L+ \"%)\";\n"7970"}\n"7971"function LerpColor(v)\n"7972"{\n"7973" let R_0 = 0;\n"7974" let G_0 = 1;\n"7975" let B_0 = 0;\n"7976"\n"7977" let R_1 = 1;\n"7978" let G_1 = 0.5;\n"7979" let B_1 = 0;\n"7980"\n"7981" let R_2 = 1;\n"7982" let G_2 = 0;\n"7983" let B_3 = 0;\n"7984" let R;\n"7985" let G;\n"7986" if(v < 0.5)\n"7987" {\n"7988" v *= 2;\n"7989" let v0 = (1-v);\n"7990" R = R_0 * v0 + R_1 * v;\n"7991" G = G_0 * v0 + G_1 * v;\n"7992"\n"7993" }\n"7994" else\n"7995" {\n"7996" v = (v-0.5) * 2;\n"7997" let v0 = (1-v);\n"7998" R = R_1 * v0 + R_2 * v;\n"7999" G = G_1 * v0 + G_2 * v;\n"8000" }\n"8001" R *= 255;\n"8002" G *= 255;\n"8003" return \"rgb(\" + R.toFixed(0) + \",\" + G.toFixed(0) + \",0)\";\n"8004"\n"8005"}\n"8006"\n"8007"function PreprocessThreadColors(S)\n"8008"{\n"8009" S.ThreadColors = Array(S.ThreadNames.length);\n"8010" for(let i = 0; i < S.ThreadNames.length; ++i)\n"8011" {\n"8012" var cidx = StringColorIndex(S.ThreadNames[i]);\n"8013" var color = \"hsl(\" + cidx + \",50%, 60%)\";\n"8014" var coloroff = \"hsl(\" + cidx + \",85%, 50%)\";\n"8015" var colordark = \"hsl(\" + cidx + \",80%, 30%)\";\n"8016" var colordark_cid = GetColorIndex(colordark);\n"8017" var colortrans = \"hsla(\" + cidx + \",55%, 80%, 0.2)\";\n"8018" S.ThreadColors[i] = {\"color\":color, \"colordark\":colordark, \"cidx\":cidx, \"gradient\":null,\"gradientoff\":null, \"coloroff\":coloroff, \"colordark_cid\":colordark_cid, \"colortrans\":colortrans};\n"8019" }\n"8020"}\n"8021"\n"8022"function PreprocessWidths()\n"8023"{\n"8024" let context = CanvasHistory.getContext(\'2d\');\n"8025" context.font = Font;\n"8026" S.TimerNameWidth = 0;\n"8027" S.GroupNameWidth = 0;\n"8028"\n"8029" for(let i in S.TimerInfo)\n"8030" {\n"8031" let str = S.GroupInfo[S.TimerInfo[i].group].name + \"XXX\" + S.TimerInfo[i].name;\n"8032" let width = context.measureText(str).width;\n"8033" let widthname = context.measureText(S.TimerInfo[i].name).width;\n"8034" S.TimerInfo[i].wtotal = width;\n"8035" S.TimerInfo[i].w = widthname;\n"8036" S.TimerNameWidth = Math.max(S.TimerNameWidth, widthname);\n"8037" }\n"8038" for(let i in S.GroupInfo)\n"8039" {\n"8040" let widthname = context.measureText(S.TimerInfo[i].name).width;\n"8041" S.GroupNameWidth = Math.max(S.GroupNameWidth, widthname);\n"8042" }\n"8043" for(let i in S.ThreadNames)\n"8044" {\n"8045" let w = context.measureText(S.ThreadNames[i]).width;\n"8046" S.ThreadNameWidth = Math.max(S.ThreadNameWidth, w);\n"8047" }\n"8048" for(let i in S.CategoryInfo)\n"8049" {\n"8050" let w = context.measureText(S.CategoryInfo[i]).width;\n"8051" S.ThreadCategoryWidth = Math.max(S.ThreadCategoryWidth, w);\n"8052" }\n"8053"}\n"8054"\n"8055"function PreprocessTimeline()\n"8056"{\n"8057" Timeline.Times = S.TimelineArray;\n"8058" Timeline.Ids = S.TimelineIdArray;\n"8059" Timeline.Colors = new Array(S.TimelineArray.length);\n"8060" Timeline.Names = S.TimelineNames;\n"8061" Timeline.Ends = new Array(S.TimelineArray.length);\n"8062" Timeline.Pairs = new Array(S.TimelineArray.length);\n"8063" Timeline.SearchMatch = new Array(S.TimelineArray.length);\n"8064" Timeline.Tracks = new Array();\n"8065" Timeline.Positions = new Array();\n"8066" for(var i = 0; i < Timeline.Times.length; ++i)\n"8067" {\n"8068" Timeline.Positions[i] = -1;\n"8069" Timeline.Ends[i] = -1;\n"8070" Timeline.Pairs[i] = -1;\n"8071" Timeline.SearchMatch[i] = false;\n"8072" var Color = S.TimelineColorArray[i]\n"8073" if(!Color || Color == \'\' || Color == \"#000000\")\n"8074" {\n"8075" Color = ColorFromString(Timeline.Names[i], 40, 50);\n"8076" }\n"8077" Timeline.Colors[i] = GetColorIndex(Color);\n"8078" if(null == Timeline.Colors[i])\n"8079" debugger;\n"8080" Timeline.Colors[i] = GetColorIndex(Color);\n"8081" }\n"8082"\n"8083"\n"8084" var LinearizeTrack = function(Track)\n"8085" {\n"8086" var b = new Array();\n"8087" var e = new Array();\n"8088" // var n = new Array();\n"8089" var k = new Array();\n"8090" var h = Track.h;\n"8091" while(h != -1)\n"8092" {\n"8093" b.push(Track.b[h]);\n"8094" e.push(Track.e[h]);\n"8095" k.push(Track.k[h]);\n"8096"\n"8097" h = Track.n[h];\n"8098" }\n"8099" }\n"8100"\n"8101" var CreateTrack = function()\n"8102" {\n"8103" var Track = {};\n"8104" Track.b = new Array();\n"8105" Track.e = new Array();\n"8106" Track.n = new Array();\n"8107" Track.k = new Array();\n"8108" Track.h = -1;\n"8109" return Track;\n"8110" }\n"8111"\n"8112"\n"8113" var TryAddToTrack = function(Track, b, e, k)\n"8114" {\n"8115" var Invalid = 0;\n"8116" var prev = -1;\n"8117" var next = Track.h;\n"8118" while(next != -1)\n"8119" {\n"8120" var B = Track.b[next];\n"8121" var E = Track.e[next];\n"8122" if(Math.max(B, b) < Math.min(E, e))\n"8123" {\n"8124" Invalid = 1;\n"8125" break;\n"8126" }\n"8127" if(E < b)\n"8128" {\n"8129" //should be after next, continue\n"8130" }else if(e < B)\n"8131" {\n"8132" //insert at this spot\n"8133" break;\n"8134" }\n"8135" prev = next;\n"8136" next = Track.n[next];\n"8137" }\n"8138" if(!Invalid)\n"8139" {\n"8140" var idx = Track.b.length;\n"8141" Track.b.push(b);\n"8142" Track.e.push(e);\n"8143" Track.k.push(k);\n"8144" Track.n.push(next);\n"8145" if(prev == -1)\n"8146" {\n"8147" Track.h = idx;\n"8148" }\n"8149" else\n"8150" {\n"8151" var h = Track.n[prev];\n"8152" if(h != next)\n"8153" {\n"8154" debugger;\n"8155" }\n"8156" Track.n[prev] = idx;\n"8157" }\n"8158" return true;\n"8159" }\n"8160" else\n"8161" {\n"8162" return false;\n"8163" }\n"8164" };\n"8165"\n"8166"\n"8167" var AddToTrack = function(b, e, k)\n"8168" {\n"8169" var Tracks = Timeline.Tracks;\n"8170"\n"8171" for(var i = 0; i < Tracks.length; ++i)\n"8172" {\n"8173" var Track = Tracks[i];\n"8174" if(TryAddToTrack(Track, b, e, k))\n"8175" {\n"8176" return i;\n"8177" }\n"8178" }\n"8179" var NewTrack = CreateTrack();\n"8180" var i = Timeline.Tracks.length;\n"8181" Timeline.Tracks.push(NewTrack);\n"8182" if(!TryAddToTrack(NewTrack, b, e, k))\n"8183" {\n"8184" debugger;\n"8185" }\n"8186" return i;\n"8187"\n"8188" };\n"8189"\n"8190" let HasMatchingName = function(index)\n"8191" {\n"8192" let name = Timeline.Names[index];\n"8193" return name && name.length > 0;\n"8194" };\n"8195"\n"8196"\n"8197"\n"8198"\n"8199"\n"8200" var Matching = {};\n"8201" var Pairs = Timeline.Pairs;\n"8202" var Ids = Timeline.Ids;\n"8203" var Ends = Timeline.Ends;\n"8204" var Times = Timeline.Times;\n"8205" if(Ids)\n"8206" {\n"8207" for(var i = 0; i < Ids.length; ++i)\n"8208" {\n"8209" Pairs[i] = -1;\n"8210" var ID = Ids[i];\n"8211" var match = Matching[ID];\n"8212" if(match >= 0)\n"8213" {\n"8214" if(match > Ids.length || match < 0)\n"8215" debugger;\n"8216" Pairs[match] = i;\n"8217" Pairs[i] = match;\n"8218" if(match > i)\n"8219" debugger;\n"8220" Ends[match] = Times[i];\n"8221" var Track = AddToTrack(Times[match], Ends[match], match);\n"8222" Timeline.Positions[match] = Track;\n"8223" delete Matching[ID];\n"8224" }\n"8225" else\n"8226" {\n"8227" if(HasMatchingName(i))\n"8228" {\n"8229" Matching[ID] = i;\n"8230" }\n"8231" }\n"8232" }\n"8233" }\n"8234" // add any unclosed markers\n"8235" for(let id in Matching)\n"8236" {\n"8237" let index = Matching[id];\n"8238" let name = Timeline.Names[index];\n"8239" if(HasMatchingName(index)) // only close if there is a matching name...\n"8240" {\n"8241" let StartTime = Times[index];\n"8242" let EndTime = S.CaptureEndTime;\n"8243" if(StartTime >= EndTime)\n"8244" {\n"8245" EndTime = EndTime + 42;\n"8246" console.log(\"End marker after captureend time. this should not happen. adding 42\");\n"8247" debugger;\n"8248" }\n"8249"\n"8250" Ends[index] = S.CaptureEndTime;\n"8251" let Track = AddToTrack(Times[index], Ends[index], index);\n"8252" Timeline.Positions[index] = Track;\n"8253" }\n"8254" }\n"8255"}\n"8256"\n"8257"function Preprocess_S()\n"8258"{\n"8259" console.log(\'preprocessing\\n\');\n"8260" S.LodData = new Array();\n"8261" S.CSwitchCache = {};\n"8262" S.CSwitchOnlyThreads = [];\n"8263" S.GroupNameWidth = 200;\n"8264" S.TimerNameWidth = 200;\n"8265" S.ThreadNameWidth = 150;\n"8266" S.ThreadCategoryWidth = 150;\n"8267"\n"8268" PreprocessCalculateAllTimers();\n"8269" PreprocessFindFirstFrames();\n"8270" PreprocessGatherLogTypes();\n"8271"\n"8272" PreprocessGlobalArray();\n"8273" PreprocessLogBarArray();\n"8274" PreprocessLods();//kill\n"8275" PreprocessMeta();//kill\n"8276" PreprocessThreadColors(S);\n"8277"\n"8278" PreprocessContextSwitchCache();\n"8279" PreprocessWidths();\n"8280"\n"8281" UpdateThreadLogAutoHide();\n"8282"\n"8283" console.log(\'preprocessing done\\n\');\n"8284" console.log(\"SS \" + S.LodData.length);\n"8285"}\n"8286"function Preprocess()\n"8287"{\n"8288" var ProfileModeOld = ProfileMode;\n"8289" ProfileMode = 1;\n"8290" ProfileModeClear();\n"8291" ProfileEnter(\"Preprocess\");\n"8292" Preprocess_S();\n"8293" UpdateReferenceTime();\n"8294"\n"8295" ProfileLeave();\n"8296" ProfileModeDump();\n"8297" ProfileMode = ProfileModeOld;\n"8298" PreprocessTimeline();\n"8299" Initialized = 1;\n"8300"}\n"8301"\n"8302"function ToggleColumn(idx, isMeta)\n"8303"{\n"8304" ColumnsEnabled[idx] = !ColumnsEnabled[idx];\n"8305" UpdateColumnsMenu();\n"8306" WriteCookie();\n"8307" Invalidate = 0;\n"8308"}\n"8309"function UpdateColumnsMenu()\n"8310"{\n"8311" var ulColumnMenu = document.getElementById(\'ColumnsSubMenu\');\n"8312" var Lis = ulColumnMenu.getElementsByTagName(\'li\');\n"8313" for(var i = 0; i < Lis.length; ++i)\n"8314" {\n"8315" if(ColumnsEnabled[i])\n"8316" {\n"8317" Lis[i].style[\'text-decoration\'] = \'underline\';\n"8318" }\n"8319" else\n"8320" {\n"8321" Lis[i].style[\'text-decoration\'] = \'none\';\n"8322" }\n"8323" }\n"8324"}\n"8325"\n"8326"function ResetColumnWidth()\n"8327"{\n"8328" if(ColumnsWidth)\n"8329" {\n"8330" for(var i = 0; i < ColumnsWidth.length; ++i)\n"8331" {\n"8332" ColumnsWidth[i] = 0;\n"8333" }\n"8334" }\n"8335"}\n"8336"var Comp0 = new Date();\n"8337"var Comp1 = new Date();\n"8338"var Comp2 = new Date();\n"8339"var Comp3 = new Date();\n"8340"\n"8341"function SetGlobal(Name, Value)\n"8342"{\n"8343" this[Name] = Value;\n"8344"}\n"8345"\n"8346"\n"8347"//compare todo:\n"8348"// **Match threads\n"8349"// **match tokens.\n"8350"// **Calculate shared screen positions.\n"8351"// **Invert second pass\n"8352"// **fix hovertoken\n"8353"// **fix range display\n"8354"// todo: isgpu\n"8355"// todo: group numtimers.\n"8356"// implement timer view\n"8357"\n"8358"function CompareFixup(S0, S1) // S0 is the reference\n"8359"{\n"8360" var GroupRemap = Array(S1.GroupInfo.length);\n"8361" var ThreadRemap = Array(S1.ThreadNames.length);\n"8362" var TimerRemap = Array(S1.TimerInfo.length);\n"8363" GroupRemapReverse = Array(S0.GroupInfo.length + S1.GroupInfo.length);\n"8364" TimerRemapReverse = Array(S0.TimerInfo.length + S1.TimerInfo.length);\n"8365" ThreadRemapReverse = Array(S0.ThreadNames.length + S1.ThreadNames.length);\n"8366"\n"8367" for(var i = 0; i < GroupRemapReverse.length; ++i)\n"8368" GroupRemapReverse[i] = -1;\n"8369" for(var i = 0; i < TimerRemapReverse.length; ++i)\n"8370" TimerRemapReverse[i] = -1;\n"8371" for(var i = 0; i < ThreadRemapReverse.length; ++i)\n"8372" ThreadRemapReverse[i] = -1;\n"8373"\n"8374"\n"8375"\n"8376" // var dump = function(SS, str)\n"8377" // {\n"8378" // console.log(str);\n"8379" // for(var i = 0; i < SS.GroupInfo.length; ++i)\n"8380" // {\n"8381" // console.log(\"G\" + i + \":\" + SS.GroupInfo[i].name);\n"8382" // }\n"8383" // for(var i = 0; i < SS.TimerInfo.length; ++i)\n"8384" // {\n"8385" // console.log(\"T\" + i + \":\" + SS.TimerInfo[i].name);\n"8386" // }\n"8387"\n"8388" // };\n"8389" // dump(S0, \"S0be4\");\n"8390" // dump(S1, \"S1be4\");\n"8391"\n"8392" for(var i = 0; i < S1.GroupInfo.length; ++i)\n"8393" {\n"8394" var n = S1.GroupInfo[i].name;\n"8395" var idx = S0.GroupInfo.findIndex(function(G){ return G.name == n; });\n"8396" if(idx != -1)\n"8397" {\n"8398" GroupRemap[i] = idx;\n"8399" }\n"8400" else\n"8401" {\n"8402" GroupRemap[i] = S0.GroupInfo.length;\n"8403" S0.GroupInfo.push(S1.GroupInfo[i]);\n"8404" }\n"8405" GroupRemapReverse[GroupRemap[i]] = i;\n"8406" }\n"8407" // for(var i = 0; i < S0.TimerInfo.length; ++i)\n"8408" // {\n"8409" // var n = S0.TimerInfo[i].name;\n"8410" // console.log(\'OG \', n, \' idx \', i);\n"8411" // }\n"8412"\n"8413" for(var i = 0; i < S1.TimerInfo.length; ++i)\n"8414" {\n"8415" var TI = S1.TimerInfo[i];\n"8416" var n = TI.name;\n"8417" var g = GroupRemap[TI.group];\n"8418" var idx = S0.TimerInfo.findIndex(function(T){ return T.name == n && T.group == g; });\n"8419" TI.group = GroupRemap[TI.group];\n"8420" if(idx != -1)\n"8421" {\n"8422" TimerRemap[i] = idx;\n"8423" }\n"8424" else\n"8425" {\n"8426" console.log(\'added timer \' + TI.name + \' idx \' + S0.TimerInfo.length);\n"8427" TimerRemap[i] = S0.TimerInfo.length;\n"8428" TI.id = S0.TimerInfo.length;\n"8429" S0.TimerInfo.push(TI);\n"8430" }\n"8431" TimerRemapReverse[TimerRemap[i]] = i;\n"8432" }\n"8433"\n"8434" var NumThreads = S0.ThreadNames.length;\n"8435"\n"8436"\n"8437" for(var i = 0; i < S1.ThreadNames.length; ++i)\n"8438" {\n"8439" var n = S1.ThreadNames[i];\n"8440" var idx = S0.ThreadNames.indexOf(n);\n"8441" if(idx != -1)\n"8442" {\n"8443" ThreadRemap[i] = idx;\n"8444" }\n"8445" else\n"8446" {\n"8447" ThreadRemap[i] = S0.ThreadNames.length;\n"8448" S0.ThreadNames.push(n);\n"8449" NumThreads++;\n"8450" }\n"8451" ThreadRemapReverse[ThreadRemap[i]] = i;\n"8452" }\n"8453"\n"8454"\n"8455" PreprocessThreadColors(S0);\n"8456" PreprocessThreadColors(S1);\n"8457"\n"8458" var Fix = function(a, r)\n"8459" {\n"8460" for(var i in a)\n"8461" {\n"8462" a[i] = r[a[i]];\n"8463" }\n"8464" };\n"8465" var FixArray = function(a, s)\n"8466" {\n"8467" if(!s)\n"8468" return;\n"8469" for(var i = 0; i < a.length; ++i)\n"8470" {\n"8471" if(!a[i])\n"8472" a[i] = [];\n"8473" }\n"8474" while(a.length != s)\n"8475" a.push([]);\n"8476" };\n"8477"\n"8478" for(var i in S0.Frames)\n"8479" {\n"8480" var F = S0.Frames[i];\n"8481" FixArray(F.ti, NumThreads);\n"8482" FixArray(F.ts, NumThreads);\n"8483" FixArray(F.tt, NumThreads);\n"8484" }\n"8485"\n"8486" for(var i in S1.Frames)\n"8487" {\n"8488" var F = S1.Frames[i];\n"8489" var ti = F.ti;\n"8490" var ts = F.ts;\n"8491" var tt = F.tt;\n"8492"\n"8493" F.ti = new Array(NumThreads);\n"8494" F.ts = new Array(NumThreads);\n"8495" F.tt = new Array(NumThreads);\n"8496"\n"8497" for(var j in ti)\n"8498" {\n"8499"\n"8500" Fix(ti[j], TimerRemap);\n"8501" F.ti[ThreadRemap[j]] = ti[j];\n"8502" }\n"8503" FixArray(F.ti, NumThreads);\n"8504" for(var i = 0; i < NumThreads; ++i)\n"8505" {\n"8506" if(!F.ti[i])\n"8507" debugger;\n"8508" }\n"8509" for(var j in ts)\n"8510" {\n"8511" F.ts[ThreadRemap[j]] = ts[j];\n"8512" }\n"8513" FixArray(F.ts, NumThreads);\n"8514" for(var i = 0; i < NumThreads; ++i)\n"8515" {\n"8516" if(!F.ts[i])\n"8517" debugger;\n"8518" }\n"8519" for(var j in tt)\n"8520" {\n"8521" F.tt[ThreadRemap[j]] = tt[j];\n"8522" }\n"8523" FixArray(F.tt, NumThreads);\n"8524"\n"8525" for(var i = 0; i < NumThreads; ++i)\n"8526" {\n"8527" if(!F.tt[i])\n"8528" debugger;\n"8529" }\n"8530" //assert length is the same\n"8531" if(F.tt.length != S0.Frames[0].tt.length)\n"8532" {\n"8533" debugger;\n"8534" }\n"8535" if(F.ti.length != S0.Frames[0].ti.length)\n"8536" {\n"8537" debugger;\n"8538" }\n"8539" if(F.ts.length != S0.Frames[0].ts.length)\n"8540" {\n"8541" debugger;\n"8542" }\n"8543" // console.log(\'log \' + i + \':\', F.ts.length, \':\', F.ti.length, \':\', F.tt.length);\n"8544" }\n"8545"\n"8546" var NewTimerInfo = Array(S0.TimerInfo.length);\n"8547" for(var i = 0; i < S1.TimerInfo.length; ++i)\n"8548" {\n"8549" let xx = TimerRemap[i];\n"8550" NewTimerInfo[xx] = S1.TimerInfo[i];\n"8551" NewTimerInfo[xx].id = xx;\n"8552" NewTimerInfo[xx].group = S0.TimerInfo[xx].group;\n"8553"\n"8554" if(NewTimerInfo[xx].id != S0.TimerInfo[xx].id)\n"8555" {\n"8556" debugger;\n"8557" }\n"8558" if(NewTimerInfo[xx].group != S0.TimerInfo[xx].group)\n"8559" {\n"8560" debugger;\n"8561" }\n"8562"\n"8563" }\n"8564" for(var i = 0; i < NewTimerInfo.length; ++i)\n"8565" {\n"8566" if(!NewTimerInfo[i])\n"8567" {\n"8568" NewTimerInfo[i] = CloneTimer(S0.TimerInfo[i]);\n"8569" NewTimerInfo[i].id = i;\n"8570" if(NewTimerInfo[i].id != S0.TimerInfo[i].id)\n"8571" {\n"8572" debugger;\n"8573" }\n"8574" if(NewTimerInfo[i].group != S0.TimerInfo[i].group)\n"8575" {\n"8576" debugger;\n"8577" }\n"8578"\n"8579" }\n"8580"";85818582const size_t g_MicroProfileHtml_end_5_size = sizeof(g_MicroProfileHtml_end_5);8583const char g_MicroProfileHtml_end_6[] =8584" }\n"8585" S1.TimerInfo = NewTimerInfo;\n"8586" var NewGroupInfo = Array(S0.GroupInfo.length);\n"8587"\n"8588" for(let i = 0; i < S1.GroupInfo.length; ++i)\n"8589" {\n"8590" let xx = GroupRemap[i];\n"8591" NewGroupInfo[xx] = S1.GroupInfo[i];\n"8592" NewGroupInfo[xx].id = xx;\n"8593" }\n"8594" for(let i = 0; i < NewGroupInfo.length; ++i)\n"8595" {\n"8596" if(!NewGroupInfo[i])\n"8597" {\n"8598" NewGroupInfo[i] = CloneGroup(S0.GroupInfo[i]);\n"8599" NewGroupInfo[i].id = i;\n"8600" }\n"8601" }\n"8602" S1.GroupInfo = NewGroupInfo;\n"8603" for(let i = 0; i < S1.GroupInfo.length; ++i)\n"8604" {\n"8605" if(S1.GroupInfo[i].id != i)\n"8606" debugger;\n"8607" if(S0.GroupInfo[i].id != i)\n"8608" debugger;\n"8609" }\n"8610"\n"8611" //debugging:\n"8612" if(S0.TimerInfo.length != S1.TimerInfo.length)\n"8613" debugger;\n"8614" for(let i = 0; i < S0.TimerInfo.length; ++i)\n"8615" {\n"8616" let t0 = S0.TimerInfo[i];\n"8617" let t1 = S1.TimerInfo[i];\n"8618" if(t0.id != t1.id)\n"8619" debugger;\n"8620" if(t0.name != t1.name)\n"8621" debugger;\n"8622" if(t0.group != t1.group)\n"8623" debugger;\n"8624" }\n"8625"\n"8626" if(S0.GroupInfo.length != S1.GroupInfo.length)\n"8627" debugger;\n"8628" for(let i = 0; i < S0.GroupInfo.length; ++i)\n"8629" {\n"8630" let t0 = S0.GroupInfo[i];\n"8631" let t1 = S1.GroupInfo[i];\n"8632" if(t0.id != t1.id)\n"8633" debugger;\n"8634" if(t0.name != t1.name)\n"8635" debugger;\n"8636" }\n"8637"}\n"8638"\n"8639"function ReadHtmlFile(File)\n"8640"{\n"8641" if (!File)\n"8642" {\n"8643" return;\n"8644" }\n"8645" var Reader = new FileReader();\n"8646" Reader.onload = function(e) {\n"8647" if(!ParseCompareData(e.target.result))\n"8648" {\n"8649" ShowFlashMessage(\"Failed to parse file\", 50);\n"8650" }\n"8651" };\n"8652" Reader.onprogress = function(e)\n"8653" {\n"8654" var m = e.loaded + \":\" + e.total + \" :: \" + e.lengthComputable;\n"8655" console.log(m);\n"8656" };\n"8657" Reader.readAsText(File);\n"8658"}\n"8659"\n"8660"function ReadHtmlFileHandler(e)\n"8661"{\n"8662" ReadHtmlFile(e.target.files[0]);\n"8663"}\n"8664"\n"8665"function ParseCompareData(Data)\n"8666"{\n"8667" S.AA = \"Original\";\n"8668" Comp1 = new Date();\n"8669"\n"8670" var idxbegin = Data.indexOf(\"//EBEGIN\");\n"8671" if(idxbegin == -1)\n"8672" return false;\n"8673" idxbegin += \"//EBEGIN\".length + 1;\n"8674" var idxend = Data.indexOf(\"//EEND\", idxbegin);\n"8675" if(idxend == -1)\n"8676" return false;\n"8677"\n"8678" Comp2 = new Date();\n"8679" var SOriginal = S;\n"8680" S = {};\n"8681"\n"8682" var idx = idxbegin;\n"8683" while(idx < idxend)\n"8684" {\n"8685" var idx0 = Data.indexOf(\'\\n\', idx);\n"8686" var s = Data.substring(idx, idx0);\n"8687" // console.log(s);\n"8688" eval(s);\n"8689" idx = idx0+1;\n"8690" }\n"8691"\n"8692" S.AA = \"Parsed\";\n"8693" var SParsed = S; //note: the calls to eval, will make a new \"S\" in local scope.\n"8694" SetGlobal(\"S\", S); //Set global S to point to new object, while its preprocessed\n"8695" Comp3 = new Date();\n"8696"\n"8697"\n"8698" CompareFixup(SOriginal, SParsed);\n"8699" Preprocess_S();\n"8700"\n"8701" var MaxStack2 = SParsed.MaxStack;\n"8702"\n"8703" var Comp4 = new Date();\n"8704" SetGlobal(\"S2\", SParsed);\n"8705" SetGlobal(\"S\", SOriginal);\n"8706"\n"8707" Preprocess_S(); //since indices are rebased, a repreprocessing is needed.\n"8708"\n"8709" SOriginal.MaxStack2 = SParsed.MaxStack;\n"8710" SParsed.MaxStack2 = SOriginal.MaxStack;\n"8711" SOriginal.SecondActive = 1;\n"8712"\n"8713"\n"8714" ThreadOrderSort();\n"8715"\n"8716" console.log(\'file loaded \' + idxbegin + \' \' + idxend );\n"8717" console.log(\'time \' + (Comp1 - Comp0));\n"8718" console.log(\'time \' + (Comp2 - Comp1));\n"8719" console.log(\'time \' + (Comp3 - Comp2).toFixed(2));\n"8720" console.log(\'time \' + (Comp4 - Comp3).toFixed(2));\n"8721" document.getElementById(\'file-input\').removeEventListener(\'change\', ReadHtmlFileHandler, false);\n"8722" let fname = document.getElementById(\'file-input\').value;\n"8723" let index = 1+Math.max(fname.lastIndexOf(\'/\'), fname.lastIndexOf(\'\\\\\'));\n"8724" if(index < fname.length)\n"8725" fname = fname.substring(index);\n"8726" let CompStr = \'Compare [\' + fname + \']\';\n"8727" RequestRedraw();\n"8728" return true;\n"8729"}\n"8730"\n"8731"function ComparePrompt()\n"8732"{\n"8733" document.getElementById(\'file-input\').addEventListener(\'change\', ReadHtmlFileHandler, false);\n"8734" document.getElementById(\'file-input\').click();\n"8735"}\n"8736"\n"8737"\n"8738"// magic from stack-overflow somewhere..\n"8739"function WindowDragEnter(e)\n"8740"{\n"8741" LastDropTarget = e.target;\n"8742" document.querySelector(\".dropzone\").style.visibility = \"\";\n"8743" document.querySelector(\".dropzone\").style.opacity = 1;\n"8744"};\n"8745"\n"8746"function WindowDragLeave(e)\n"8747"{\n"8748" if(e.target === LastDropTarget || e.target === document)\n"8749" {\n"8750" document.querySelector(\".dropzone\").style.visibility = \"hidden\";\n"8751" document.querySelector(\".dropzone\").style.opacity = 0;\n"8752" }\n"8753"};\n"8754"function DropHandler(ev)\n"8755"{\n"8756" document.querySelector(\".dropzone\").style.visibility = \"hidden\";\n"8757" document.querySelector(\".dropzone\").style.opacity = 0;\n"8758" LastDropTarget = null;\n"8759"\n"8760" if(ev.dataTransfer.files.length > 0)\n"8761" {\n"8762" let File = ev.dataTransfer.files[0];\n"8763" let Name = File.name\n"8764" let ExtMatch = Name.match(/\\.[0-9a-zA-Z]+$/);\n"8765" let Ext = ExtMatch ? ExtMatch[0] : \"\";\n"8766" if(Ext.toLowerCase() == \".html\")\n"8767" {\n"8768" ReadHtmlFile(File);\n"8769" }\n"8770" else\n"8771" {\n"8772" window.alert(\"Not a .html file!\\n\" + Name);\n"8773" }\n"8774" }\n"8775" ev.preventDefault(); \n"8776"}\n"8777"\n"8778"function DragOverHandler(ev)\n"8779"{\n"8780" ev.preventDefault(); \n"8781"}\n"8782"\n"8783"var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? \"DOMMouseScroll\" : \"mousewheel\" //FF doesn\'t recognize mousewheel as of FF3.x\n"8784"\n"8785"CanvasDetailedView.addEventListener(\'mousemove\', MouseMove, false);\n"8786"CanvasDetailedView.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"8787"CanvasDetailedView.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"8788"CanvasDetailedView.addEventListener(\'mouseout\', MouseOut);\n"8789"CanvasDetailedView.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"8790"CanvasDetailedView.addEventListener(mousewheelevt, MouseWheel, false);\n"8791"CanvasHistory.addEventListener(\'mousemove\', MouseMove);\n"8792"CanvasHistory.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"8793"CanvasHistory.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"8794"CanvasHistory.addEventListener(\'mouseout\', MouseOut);\n"8795"CanvasHistory.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"8796"CanvasHistory.addEventListener(mousewheelevt, MouseWheel, false);\n"8797"CanvasMenu.addEventListener(\'mousemove\', MouseMove);\n"8798"CanvasMenu.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"8799"CanvasMenu.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"8800"CanvasMenu.addEventListener(\'mouseout\', MouseOut);\n"8801"CanvasMenu.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"8802"CanvasMenu.addEventListener(mousewheelevt, MouseWheel, false);\n"8803"FilterInputTimer.addEventListener(\'keyup\', FilterKeyUp);\n"8804"FilterInputGroup.addEventListener(\'keyup\', FilterKeyUp);\n"8805"\n"8806"window.addEventListener(\'keydown\', KeyDown);\n"8807"window.addEventListener(\'keyup\', KeyUp);\n"8808"window.addEventListener(\'resize\', ResizeCanvas, false);\n"8809"window.addEventListener(\"dragenter\", WindowDragEnter);\n"8810"window.addEventListener(\"dragleave\", WindowDragLeave);\n"8811"document.addEventListener(\'mouseout\', (e) => {\n"8812" if (!e.relatedTarget && !e.toElement) {\n"8813" MouseOut();\n"8814" }\n"8815"});\n"8816"\n"8817"InitGroups();\n"8818"ReadCookie();\n"8819"MeasureFont();\n"8820"ThreadOrderSort();\n"8821"InitOrderArrays();\n"8822"InitMenu();\n"8823"InitFrameInfo();\n"8824"ResizeCanvas();\n"8825"Preprocess();\n"8826"OnPageReady();\n"8827"Draw(1);\n"8828"\n"8829"\n"8830"</script>\n"8831"</body>\n"8832"</html>";88338834const size_t g_MicroProfileHtml_end_6_size = sizeof(g_MicroProfileHtml_end_6);8835const char* g_MicroProfileHtml_end[] = {8836&g_MicroProfileHtml_end_0[0],8837&g_MicroProfileHtml_end_1[0],8838&g_MicroProfileHtml_end_2[0],8839&g_MicroProfileHtml_end_3[0],8840&g_MicroProfileHtml_end_4[0],8841&g_MicroProfileHtml_end_5[0],8842&g_MicroProfileHtml_end_6[0],8843};8844size_t g_MicroProfileHtml_end_sizes[] = {8845sizeof(g_MicroProfileHtml_end_0),8846sizeof(g_MicroProfileHtml_end_1),8847sizeof(g_MicroProfileHtml_end_2),8848sizeof(g_MicroProfileHtml_end_3),8849sizeof(g_MicroProfileHtml_end_4),8850sizeof(g_MicroProfileHtml_end_5),8851sizeof(g_MicroProfileHtml_end_6),8852};8853size_t g_MicroProfileHtml_end_count = 7;8854#endif //MICROPROFILE_EMBED_HTML88558856///end file generated from microprofile.html8857///start file generated from microprofilelive.html8858#ifdef MICROPROFILE_EMBED_HTML8859const char g_MicroProfileHtmlLive_begin_0[] =8860"<!DOCTYPE HTML>\n"8861"<html>\n"8862"<head>\n"8863"<title>MicroProfile Live</title>\n"8864"<link rel=\"manifest\" href=\'data:application/manifest+json,{\n"8865" \"name\":\"MicroProfile\",\n"8866" \"short_name\":\"MicroProfile\",\n"8867" \"start_url\":\"http://localhost:1338/\",\n"8868" \"scope\":\"http://localhost:1338/\",\n"8869" \"display\":\"standalone\",\n"8870" \"background_color\":\"black\",\n"8871" \"theme_color\":\"white\",\n"8872" \"icons\":[\n"8873" {\n"8874" \"src\":\"http://localhost:1338/favicon.png\",\n"8875" \"sizes\":\"512x512\",\n"8876" \"type\":\"image/png\"\n"8877" }\n"8878" ]\n"8879"}\'>\n"8880"\n"8881"<style>\n"8882"/* about css: http://bit.ly/1eMQ42U */\n"8883"body {margin: 0px;padding: 0px; font: 12px Courier New;background-color:#343434; color:white;overflow:hidden;}\n"8884"ul {list-style-type: none;margin: 0;padding: 0;}\n"8885"li{display: inline; float:left;border:5px; position:relative;text-align:center;}\n"8886"a {\n"8887" float:left;\n"8888" text-decoration:none;\n"8889" display: inline;\n"8890" text-align: center;\n"8891" padding:5px;\n"8892" padding-bottom:0px;\n"8893" padding-top:0px;\n"8894" color: #FFFFFF;\n"8895" background-color: #343434;\n"8896"}\n"8897"a:hover, a:active{\n"8898" background-color: #000000;\n"8899"}\n"8900"\n"8901"ul ul {\n"8902" position:absolute;\n"8903" left:0;\n"8904" top:100%;\n"8905" margin-left:-999em;\n"8906"}\n"8907"li:hover ul {\n"8908" margin-left:0;\n"8909" margin-right:0;\n"8910"}\n"8911"ul li ul{ display:block;float:none;width:100%;}\n"8912"ul li ul li{ display:block;float:none;width:100%;}\n"8913"li li a{ display:block;float:none;width:100%;text-align:left;}\n"8914"#nav li:hover div {margin-left:0;}\n"8915".dropzone {display:flex;justify-content:center;align-items:center;font-size:50px;position: fixed; top: 0; left: 0; z-index: 9999999999; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);transition: visibility 175ms, opacity 175ms;}\n"8916".help {position:absolute;z-index:5;text-align:left;padding:2px;margin-left:-999em;background-color: #313131;width:300px;}\n"8917".helpstart {position:absolute;z-index:5;text-align:left;padding:2px;background-color: #313131;width:300px;display:none}\n"8918".root {z-index:1;position:absolute;top:0px;left:0px;}\n"8919".filterinputsearchdiv{position:fixed; background-color: #313131;display:none;}\n"8920".filterinputsearch{width:100px;}\n"8921" #popup-overlay {\n"8922" display: none;\n"8923" position: fixed;\n"8924" top: 0; left: 0;\n"8925" width: 100vw; height: 100vh;\n"8926" background-color: rgba(0, 0, 0, 0.5);\n"8927" align-items: center;\n"8928" justify-content: center;\n"8929" z-index: 10;\n"8930" }\n"8931"\n"8932" #popup-box {\n"8933" background: #343434;\n"8934" padding: 20px 30px;\n"8935" border-radius: 8px;\n"8936" box-shadow: 0 0 20px rgba(0,0,0,0.3);\n"8937" min-width: 320px;\n"8938" text-align: left;\n"8939" }\n"8940"\n"8941" #popup-description {\n"8942" margin-bottom: 15px;\n"8943" }\n"8944"\n"8945" .popup-field {\n"8946" margin-bottom: 15px;\n"8947" }\n"8948"\n"8949" .popup-field label {\n"8950" display: block;\n"8951" font-weight: bold;\n"8952" margin-bottom: 5px;\n"8953" }\n"8954"\n"8955" .popup-field input {\n"8956" width: 100%;\n"8957" padding: 8px;\n"8958" box-sizing: border-box;\n"8959" }\n"8960"\n"8961" .button-row {\n"8962" text-align: right;\n"8963" }\n"8964"\n"8965" #popup-box button {\n"8966" padding: 6px 14px;\n"8967" margin-top: 10px;\n"8968" margin-right: 10px;\n"8969" cursor: pointer;\n"8970" }\n"8971"</style>\n"8972"</head>\n"8973"<body style=\"\">\n"8974"<div style=\"visibility:hidden; opacity:0\" class=\"dropzone\" ondrop=\"DropHandler(event);\" ondragover=\"DragOverHandler(event);\">drop .csv files to view CSV data</div>\n"8975"<div class=\"filterinputsearchdiv\" id=\"FilterInputDiv\">Filter<br><input type=\"text\" id=\"FilterInput\" class=\"filterinputsearch\"></div>\n"8976"<div class=\"helpstart\" id=\"helpwindow\" style=\"left:20px;top:20px\">\n"8977"History View:<br>\n"8978"Right Click + Drag : Select Region<br>\n"8979"Click + Drag: Move Selection<br>\n"8980"Click Frame : Center on frame<br>\n"8981"<hr>\n"8982"Main View:<br>\n"8983"space: Freeze capturing<br>\n"8984"x : Toggle View<br>\n"8985"/ : Rotate connection port % 3<br>\n"8986"Ctrl + Drag: Pan<br>\n"8987"Click + Drag: Pan<br>\n"8988"Enter: Capture selection/Next N Frames\n"8989"<hr>\n"8990"<table style=\"width:100%\">\n"8991"<tr>\n"8992"<td width=\"50%\" align=\"left\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0);\">Close</a></td>\n"8993"</tr>\n"8994"</table>\n"8995"</div>\n"8996"<div id=\"popup-overlay\">\n"8997" <div id=\"popup-box\">\n"8998" <div id=\"popup-description\"></div>\n"8999" <div id=\"popup-fields\"></div>\n"9000" <div class=\"button-row\">\n"9001" <button onclick=\"popupOk()\">OK</button>\n"9002" <button onclick=\"popupCancel()\">Cancel</button>\n"9003" </div>\n"9004" </div>\n"9005"</div>\n"9006"\n"9007"<canvas id=\"DetailedView\" height=\"100%\" style=\"background-color:#343434;margin:0px;padding:0px;\"></canvas>\n"9008"<script>\n"9009"\"use strict\"\n"9010"\n"9011"\n"9012"const popupOverlay = document.getElementById(\'popup-overlay\');\n"9013"const popupDescription = document.getElementById(\'popup-description\');\n"9014"const popupFields = document.getElementById(\'popup-fields\');\n"9015"let popupCallback = null;\n"9016"\n"9017"function showPopup(description, fields, callback)\n"9018"{\n"9019" popupCallback = callback;\n"9020" popupDescription.textContent = description;\n"9021" popupFields.innerHTML = \"\";\n"9022" fields.forEach((field, index) => {\n"9023" const div = document.createElement(\'div\');\n"9024" div.className = \'popup-field\';\n"9025"\n"9026" const label = document.createElement(\'label\');\n"9027" label.textContent = field.label;\n"9028" label.htmlFor = `popup-input-${index}`;\n"9029"\n"9030" const input = document.createElement(\'input\');\n"9031" input.id = `popup-input-${index}`;\n"9032" input.value = field.value || \'\';\n"9033"\n"9034" div.appendChild(label);\n"9035" div.appendChild(input);\n"9036" popupFields.appendChild(div);\n"9037" });\n"9038" popupOverlay.style.display = \"flex\";\n"9039" popupFields.querySelector(\"input\").focus();\n"9040"\n"9041"}\n"9042"function popupOk()\n"9043"{\n"9044" const inputs = popupFields.querySelectorAll(\"input\");\n"9045" const values = [];\n"9046" inputs.forEach((input, index) => {\n"9047" const label = popupFields.querySelectorAll(\"label\")[index].textContent;\n"9048" values[index] = input.value;\n"9049" });\n"9050" popupCallback(values);\n"9051" popupCallback = null;\n"9052" popupOverlay.style.display = \"none\";\n"9053"}\n"9054"function popupCancel() {\n"9055" popupCallback = null;\n"9056" popupOverlay.style.display = \"none\";\n"9057"}\n"9058"\n"9059"\n"9060"var FRAME_HISTORY_COLOR_CPU = \'#ff7f27\';\n"9061"var FRAME_HISTORY_COLOR_GPU = \'#ffffff\';\n"9062"\n"9063"var Settings = {};\n"9064"var Cookie = {};\n"9065"\n"9066"const PERCENTILE_SAMPLES = 1000;\n"9067"\n"9068"var HistoryHeight = 100;\n"9069"var CanvasDetailedView = document.getElementById(\'DetailedView\');\n"9070"var CanvasDetailedOffscreen = document.createElement(\'canvas\');\n"9071"var FilterInput = document.getElementById(\'FilterInput\');\n"9072"var FilterInputDiv = document.getElementById(\'FilterInputDiv\');\n"9073"var FilterInputDivPos = {\"x\":-1,\"y\":-1,\"w\":-1,\"h\":-1};\n"9074"var FilterInputValueLast = \'\';\n"9075"\n"9076"var CanvasArray0 = [];\n"9077"var CanvasArray1 = [];\n"9078"var Views = [];\n"9079"\n"9080"var ViewIndex = 0;\n"9081"\n"9082"var nWidth = CanvasDetailedView.width;\n"9083"var nHeight = CanvasDetailedView.height;\n"9084"var nBackColors = [\'#292929\', \'#343434\' ];\n"9085"var nBackColorsDark = [\'#292929\', \'#272727\' ];\n"9086"var nBackColorOffset = \'#404040\';\n"9087"const FontHeight = 10;\n"9088"const FontHeightLarge = 12;\n"9089"const FontHeightLarger = 22;\n"9090"var FontWidth = 1;\n"9091"var FontAscent = 3; //Set manually\n"9092"const Font = \'Bold \' + FontHeight + \'px Courier New\';\n"9093"const FontLarge = \'Bold \' + FontHeightLarge + \'px Courier New\';\n"9094"const FontLarger = \'Bold \' + FontHeightLarger + \'px Courier New\';\n"9095"const FontFlash = \'Bold \' + 35 + \'px Courier New\';\n"9096"var BoxHeight = FontHeight + 2;\n"9097"var MouseX = 0;\n"9098"var MouseY = 0;\n"9099"var MouseReleased = false;\n"9100"var MouseMoveTime = new Date();\n"9101"\n"9102"var nBarsWidth = 80;\n"9103"var nOffsetBarsX = 0;\n"9104"var nOffsetBarsY = 0;\n"9105"var nOffsetCountersY = 0;\n"9106"var nOffsetMenuTimers = 0;\n"9107"var nOffsetMenuGroup = 0;\n"9108"var nOffsetMenuCounters = 0;\n"9109"var nOffsetMenuFunctions = 0;\n"9110"var nOffsetMenuModules = 0;\n"9111"var nOffsetMenuPatched = 0;\n"9112"\n"9113"var nHoverCounter = -1;\n"9114"\n"9115"var MouseDragOff = 0;\n"9116"var MouseDragDown = 1;\n"9117"var MouseDragUp = 2;\n"9118"var MouseDragMove = 3;\n"9119"var MouseDragState = MouseDragOff;\n"9120"var MouseDragTarget = 0;\n"9121"var MouseDragButton = 0;\n"9122"var MouseDragKeyShift = 0;\n"9123"var MouseDragKeyCtrl = 0;\n"9124"var MouseDragX = 0;\n"9125"var MouseDragY = 0;\n"9126"var MouseDragXLast = 0;\n"9127"var MouseDragYLast = 0;\n"9128"var MouseDragXStart = 0;\n"9129"var MouseDragYStart = 0;\n"9130"\n"9131"var MouseDragActiveXStart = 0;\n"9132"var MouseDragActiveXEnd = -1;\n"9133"var MouseInCaptureButton = 0;\n"9134"\n"9135"var ToolTipCallback = null;\n"9136"\n"9137"var DPR = 0;\n"9138"var C_HUGE = 1e10;\n"9139"\n"9140"var ActivePreset = \"Default\";\n"9141"var ActivePresetRO = 0;\n"9142"var PresetPending = 0;\n"9143"var Presets = [];\n"9144"var PresetsCache = {};\n"9145"var ReadOnlyPresets = [];\n"9146"var ReadOnlyPresetsCache = {};\n"9147"\n"9148"Settings.SubGraphSettings = {};\n"9149"Settings.SubGraphSettingsPercentile = {};\n"9150"Settings.ReferenceTime = 100.0;\n"9151"\n"9152"const ReferencePresets = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 15.0, 20, 30, 33.33, 50, 66.66,100.0,250.0,500,1000.0];\n"9153"const PercentilePresets = [0.0, 1.0, 5.0, 10.0, 50.0, 75.0, 99.0];\n"9154"let ReferenceTimeTweak = -1;\n"9155"const CounterByteNames = [\"bytes\", \"kilobytes\", \"megabytes\", \"gigabytes\"];\n"9156"let PercentileTweak = -1;\n"9157"\n"9158"Settings.TargetTime = 15;\n"9159"var TargetTimeTweak = -1;\n"9160"\n"9161"Settings.GraphSoftFrames = 5;\n"9162"Settings.GraphSoftMode = 0;\n"9163"const GraphSoftFramePresets = [2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30];\n"9164"const GraphSoftFrameModeNames = [\"off\", \"avg\", \"min\", \"max\"];\n"9165"\n"9166"\n"9167"var AggregateFrames = 60;\n"9168"Settings.AggregateFrames = 60;\n"9169"var AggregatePresets = [0, 10,20,30,60,90,120,500];\n"9170"var AggregateHistorySize = 5;\n"9171"var AggregateTweak = -1;\n"9172"var AggregateCurrent = 0;\n"9173"\n"9174"var AutoCaptureCooldown = -1;\n"9175"var AutoCaptureEnabled = 0;\n"9176"var AutoCaptureDefaultThreshold = 66;\n"9177"Settings.AutoCaptureTheshold = AutoCaptureDefaultThreshold;\n"9178"Settings.AutoCaptureRepeat = 1;\n"9179"var AutoCaptureThesholdPresets = [1,3,5,10,15,30,50,66,90,100,250,500,1000];\n"9180"var AutoCaptureRepeatPresets = [1,2,3,4,5,6,7,8,9,10, 25, 50, 100];\n"9181"var AutoCaptureTweak = -1;\n"9182"var AutoCaptureRepeatTweak = -1;\n"9183"var AutoCaptureSourceTweak = -1;\n"9184"var AutoCaptureSourceIndex = -1;\n"9185"\n"9186"var CaptureFramesDefault = 30;\n"9187"Settings.CaptureFrames = CaptureFramesDefault;\n"9188"Settings.CaptureDelay = 0;\n"9189"var CaptureFramesPresets = [5,10,15,30,50,66,90,100];\n"9190"var CaptureDelayPresets = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n"9191"var CaptureTweak = -1;\n"9192"var CaptureDelayTweak = -1;\n"9193"\n"9194"var CaptureTriggerTime = null;\n"9195"var CaptureTriggerTimeType = 0;\n"9196"var CaptureTriggerDelta = 0;\n"9197"\n"9198"let LastDropTarget = null;\n"9199"\n"9200"\n"9201"\n"9202"var ProfileData = {};\n"9203"var ProfileStackTime = [];\n"9204"var ProfileStackName = [];\n"9205"var ProfileMode = 0;\n"9206"var ProfileRedraw0 = 0;\n"9207"var ProfileRedraw1 = 0;\n"9208"var ProfileRedraw2 = 0;\n"9209"var ProfileFps = 0;\n"9210"var ProfileMs = 0;\n"9211"var ProfileFpsAggr = 0;\n"9212"var ProfileFpsCount = 0;\n"9213"var ProfileLastTimeStamp = new Date();\n"9214"var PlotfArray = new Array();\n"9215"\n"9216"var ConnectionStr = [\"\\\\\", \"|\", \"/\", \"-\" ];\n"9217"var ConnectionIdx = 0;\n"9218"var EnabledArray = [];\n"9219"\n"9220"\n"9221"var FrameData = {};\n"9222"var FRAME_COUNT = 1000;\n"9223"var FramePending = 0;\n"9224"\n"9225"var WSConnected = 0;\n"9226"var WSIsOpen = 0;\n"9227"var WSSeconds = 0;\n"9228"var WSFail = 0;\n"9229"var WS;\n"9230"var WSHost = location.hostname ? location.hostname : \"localhost\";\n"9231"var WSPort = location.port ? location.port : 1338;\n"9232"var WSPath;\n"9233"\n"9234"var CaptureButtonX = 0;\n"9235"var CaptureButtonY = 0;\n"9236"var GroupsEnabled = 0;\n"9237"var TimersEnabled = 0;\n"9238"let CountersEnabled = 0;\n"9239"\n"9240"var TimersActiveOnly = 0;\n"9241"\n"9242"\n"9243"const MSG_TIMER_TREE = 1;\n"9244"const MSG_ENABLED = 2;\n"9245"const MSG_FRAME = 3;\n"9246"const MSG_LOADSETTINGS = 4;\n"9247"const MSG_PRESETS = 5;\n"9248"const MSG_CURRENTSETTINGS = 6;\n"9249"const MSG_COUNTERS = 7;\n"9250"const MSG_FUNCTION_RESULTS = 8;\n"9251"const MSG_INACTIVE_FRAME = 9;\n"9252"const MSG_FUNCTION_NAMES = 10;\n"9253"const MSG_INSTRUMENT_ERROR = 11;\n"9254"const MSG_QUERY_INDEX = 12;\n"9255"\n"9256"\n"9257"const TYPE_NONE = 0;\n"9258"const TYPE_TIMER = 1;\n"9259"const TYPE_GROUP = 2;\n"9260"const TYPE_CATEGORY = 3;\n"9261"const TYPE_SETTING = 4;\n"9262"const TYPE_COUNTER = 5;\n"9263"\n"9264"const MicroProfileTokenTypeCpu=0;\n"9265"const MicroProfileTokenTypeGpu=1;\n"9266"\n"9267"\n"9268"let WSSend = 0;\n"9269"let WSReceive = 0;\n"9270"let WSSendBytes = 0;\n"9271"let WSReceiveBytes = 0;\n"9272"let WSOpenTime = 0;\n"9273"let WSReadyState = 9999;\n"9274"\n"9275"\n"9276"var TimerArray = [];\n"9277"var CounterArray = [];\n"9278"var Empty = {\"id\":0, \"w\":0, \"depth\":0, \"sibling\":-1,\"parent\":-1,\"firstchild\":-1};\n"9279"var WidthArray = [];\n"9280"var FunctionQueryArray = [];\n"9281"var FunctionQueryPending = null;\n"9282"var FunctionQueryLastRequest = 0;\n"9283"var FunctionQueryReceived = 0;\n"9284"var WidthTree = 0;\n"9285"Settings.ViewActive = 0;\n"9286"Settings.ViewCompressed = 0;\n"9287"Settings.AllowHighDPI = 1;\n"9288"let ViewCompressedTimeout = -1;\n"9289"const ViewNames = [\"Graph\", \"Graph\", \"Graph\", \"Bars\", \"Bars\", \"Bars\", \"Counters\"];\n"9290"const ViewNames2 = [\"[split]\", \"[percentile]\",\"[group/thread]\",\"[table]\", \"[all]\", \"[single]\", \"\"];\n"9291"\n"9292"const VIEW_GRAPH_SPLIT = 0;\n"9293"// var VIEW_GRAPH = 1;\n"9294"const VIEW_GRAPH_PERCENTILE = 1;\n"9295"const VIEW_GRAPH_THREAD_GROUP = 2;\n"9296"const VIEW_BAR = 3;\n"9297"const VIEW_BAR_ALL = 4;\n"9298"const VIEW_BAR_SINGLE = 5;\n"9299"const VIEW_COUNTERS = 6;\n"9300"const VIEW_SIZE = 7;\n"9301"const GRAPH_ALPHA = 0.5;\n"9302"\n"9303"\n"9304"Settings.AutomaticReference = 0;\n"9305"Cookie.CodeReportMode = 0; // 0: prompt, 1:always send, 2: never send, never prompt\n"9306"\n"9307"\n"9308"let ReferenceHistory = 0;\n"9309"let ReferenceGraph = 0;\n"9310"let ReferenceBar = 0;\n"9311"let ReferenceHistoryAutomatic = 0;\n"9312"let ReferenceGraphAutomatic = 0;\n"9313"let ReferenceGraphAutomaticGroup = 0;\n"9314"let ReferenceBarAutomatic = 0;\n"9315"\n"9316"let SingleTimerBars = 0;\n"9317"let History;\n"9318"let MainView;\n"9319"let X7Views;\n"9320"let X7LegendView;\n"9321"let X7BarColumnRemap = [0,1,2,3,4,5,6];\n"9322"let X7BarColumnMask = -1;\n"9323"let X7LegendOffset = 25;\n"9324"let X7BarLastView = -1;\n"9325"let X7BarFirstView = -1;\n"9326"\n"9327"\n"9328"let ViewBarMaxMsTextLength = 0;\n"9329"\n"9330"Settings.SortColumnOrderFlip = 0;\n"9331"Settings.SortColumnName = \"\";\n"9332"var SortColumnMouseOverNext = \"\";\n"9333"\n"9334"\n"9335"let KeyShiftDown = 0;\n"9336"let KeyCtrlDown = 0;\n"9337"let PromptActive = 0;\n"9338"let PromptExitTime = new Date();\n"9339"\n"9340"let IsFrozen = 0;\n"9341"\n"9342"let PresetToLoad;\n"9343"let PresetToLoadRO = 0;\n"9344"let HelpFade;\n"9345"\n"9346"\n"9347"TimerArray.push(Empty); // 0 is root of tree\n"9348"\n"9349"const StrTime = \"Time\";\n"9350"const StrExclusive = \"Excl Time\";\n"9351"const StrGroup = \"Group\";\n"9352"const StrThread = \"Thread\";\n"9353"const StrTimer = \"Timer\";\n"9354"const StrAverage = \"Average\";\n"9355"const StrMax = \"Max\";\n"9356"const StrTotal = \"Total\";\n"9357"const StrExclTotal = \"Excl Total\";\n"9358"const StrMin = \"Min\";\n"9359"const StrSpike = \"Spike%\";\n"9360"const StrCallAverage = \"Call Average\";\n"9361"const StrCount = \"Count\";\n"9362"const StrExclAverage = \"Excl Average\";\n"9363"const StrExclMax = \"Excl Max\";\n"9364"const StrExclMin = \"Excl Max\";\n"9365"const StrCallExclAverage = \"Call Excl Avg\";\n"9366"\n"9367"\n"9368"let CounterNameWidth = 100;\n"9369"let CounterNameMenuWidth = 100;\n"9370"let CounterFullNameWidth = 100;\n"9371"let CounterValueWidth = 100;\n"9372"let CounterLimitWidth = 100;\n"9373"\n"9374"const FormatCounterDefault = 0;\n"9375"const FormatCounterBytes = 1;\n"9376"const FormatCounterBytesExt = [\"b\",\"kb\",\"mb\",\"gb\",\"tb\",\"pb\",\"eb\",\"zb\",\"yb\"];\n"9377"\n"9378"const BarColumnNamesTable = [StrTime, StrExclusive, StrAverage, StrMax, StrMin, StrTotal, StrExclAverage, StrExclMax, StrExclTotal, StrSpike, StrCallAverage, StrCallExclAverage, StrCount];\n"9379"const BarColumnNamesMulti = [StrTime, StrAverage, StrMax, StrMin, StrExclAverage, StrExclMax, StrExclMin];\n"9380"const BarColumnNamesSingle = [StrAverage, StrMax, StrMin, StrExclAverage, StrExclMax, StrExclMin, StrCallAverage];\n"9381"\n"9382"// var SYMBOLSTATE_DEFAULT = 0;\n"9383"// var SYMBOLSTATE_LOADING = 1;\n"9384"// var SYMBOLSTATE_DONE = 2;\n"9385"\n"9386"\n"9387"var SymbolState;\n"9388"var ModuleState = [];\n"9389"\n"9390"var FunctionsInstrumented = [];\n"9391"var FunctionsInstrumentedUnmangled = [];\n"9392"var FunctionsInstrumentedModule = [];\n"9393"var PopupsAllowed = 0;\n"9394"var PopupsFailed = 0;\n"9395"var PopupTestPending = 0;\n"9396"\n"9397"var ThreadInfo = {};\n"9398"\n"9399"function ConvertHslToRGB(h, s, l) //from https://gist.github.com/mjackson/5311256\n"9400"{\n"9401" var r, g, b;\n"9402" if (s == 0)\n"9403" {\n"9404" r = g = b = l; // achromatic\n"9405" }\n"9406" else\n"9407" {\n"9408" function hue2rgb(p, q, t)\n"9409" {\n"9410" if (t < 0) t += 1;\n"9411" if (t > 1) t -= 1;\n"9412" if (t < 1/6) return p + (q - p) * 6 * t;\n"9413" if (t < 1/2) return q;\n"9414" if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n"9415" return p;\n"9416" }\n"9417" var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n"9418" var p = 2 * l - q;\n"9419" r = hue2rgb(p, q, h + 1/3);\n"9420" g = hue2rgb(p, q, h);\n"9421" b = hue2rgb(p, q, h - 1/3);\n"9422" }\n"9423" var color = ((r*255)<<16) | ((g*255)<<8) | (b*255);\n"9424" return (\"000000\" + color.toString(16)).slice(-6);\n"9425"}\n"9426"\n"9427"\n"9428"function GetBarColumnNames()\n"9429"{\n"9430" if(Settings.ViewActive == VIEW_BAR_ALL)\n"9431" {\n"9432" return BarColumnNamesMulti;\n"9433" }\n"9434" else if(Settings.ViewActive == VIEW_BAR_SINGLE)\n"9435" {\n"9436" return BarColumnNamesSingle;\n"9437" }\n"9438" else\n"9439" {\n"9440" return BarColumnNamesTable;\n"9441" }\n"9442"}\n"9443"function GetBarColumnEnabled()\n"9444"{\n"9445" if(Settings.ViewActive == VIEW_BAR_ALL)\n"9446" {\n"9447" return Settings.BarColumnEnabledMulti;\n"9448" }\n"9449" else if(Settings.ViewActive == VIEW_BAR_SINGLE)\n"9450" {\n"9451" return Settings.BarColumnEnabledSingle;\n"9452" }\n"9453" else\n"9454" {\n"9455" return Settings.BarColumnEnabledTable;\n"9456" }\n"9457"}\n"9458"\n"9459"Settings.BarColumnEnabledTable = new Array(BarColumnNamesTable.length);\n"9460"Settings.BarColumnEnabledSingle = new Array(BarColumnNamesSingle.length);\n"9461"Settings.BarColumnEnabledMulti = new Array(BarColumnNamesMulti.length);\n"9462"var ColumnsWidth = new Array(BarColumnNamesTable.length);\n"9463"function ClearEnabled(E)\n"9464"{\n"9465" for(var i = 0; i < E.length; ++i)\n"9466" {\n"9467" E[i] = 1;\n"9468" ColumnsWidth[i] = 10;\n"9469" }\n"9470"}\n"9471"ClearEnabled(Settings.BarColumnEnabledTable);\n"9472"ClearEnabled(Settings.BarColumnEnabledSingle);\n"9473"ClearEnabled(Settings.BarColumnEnabledMulti);\n"9474"\n"9475"function Plotf(str)\n"9476"{\n"9477" PlotfArray.push(str);\n"9478"}\n"9479"function PlotfClear()\n"9480"{\n"9481" PlotfArray = new Array();\n"9482"}\n"9483"\n"9484"function ProfileModeClear()\n"9485"{\n"9486" if(ProfileMode)\n"9487" {\n"9488" for(var idx in ProfileData)\n"9489" {\n"9490" if(idx == \"Plot\")\n"9491" continue;\n"9492" var Timer = ProfileData[idx];\n"9493" Timer.Count = 0;\n"9494" Timer.Time = 0;\n"9495" }\n"9496"\n"9497" // ProfileData = new Object();\n"9498" ProfileStackTime = new Array();\n"9499" ProfileStackName = new Array();\n"9500" }\n"9501"}\n"9502"function ProfileEnter(Name)\n"9503"{\n"9504" if(ProfileMode)\n"9505" {\n"9506" ProfileStackTime.push(performance.now());\n"9507" ProfileStackName.push(Name);\n"9508" }\n"9509"}\n"9510"function ProfileLeave()\n"9511"{\n"9512" if(ProfileMode)\n"9513" {\n"9514" var Time = performance.now();\n"9515" var Delta = Time - ProfileStackTime.pop();\n"9516" var Name = ProfileStackName.pop();\n"9517" var Obj = ProfileData[Name];\n"9518" if(!Obj)\n"9519" {\n"9520" Obj = new Object();\n"9521" Obj.Count = 0;\n"9522" Obj.Name = Name;\n"9523" Obj.Time = 0;\n"9524" Obj.AggrCount = 0;\n"9525" Obj.AggrTime = 0;\n"9526" Obj.AggrMax = 0;\n"9527" Obj.AvgTime = 0;\n"9528" Obj.MaxTime = 0;\n"9529" Obj.TotalTime = 0;\n"9530" ProfileData[Name] = Obj;\n"9531" }\n"9532" Obj.Time += Delta;\n"9533" Obj.Count += 1;\n"9534" }\n"9535"}\n"9536"\n"9537"function ProfilePlot(s)\n"9538"{\n"9539" if(ProfileMode)\n"9540" {\n"9541" var A = ProfileData.Plot;\n"9542" if(!A)\n"9543" {\n"9544" ProfileData.Plot = Array();\n"9545" A = ProfileData.Plot;\n"9546" }\n"9547" if(A.length<10)\n"9548" {\n"9549" A.push(s);\n"9550" }\n"9551" }\n"9552"}\n"9553"function ProfileModeDump()\n"9554"{\n"9555" for(var idx in ProfileData)\n"9556" {\n"9557" var Timer = ProfileData[idx];\n"9558" console.log(Timer.Name + \" \" + Timer.Time + \"ms \" + Timer.Count);\n"9559" }\n"9560"\n"9561"}\n"9562"function ProfileModeDraw(Canvas)\n"9563"{\n"9564" if(ProfileMode)\n"9565" {\n"9566" ProfileFpsCount ++ ;\n"9567" var AggrFrames = 60;\n"9568" var StringArray = [];\n"9569" function FormatTime(f)\n"9570" {\n"9571" return (\" \" + f.toFixed(2)).slice(-12);\n"9572" }\n"9573" function FormatStr(t, count, avg, max, total)\n"9574" {\n"9575" var str = FormatTime(t) + \"ms \" + (\" #\" + count).slice(-8) +\n"9576" \"\" + FormatTime(avg) + \"ms \" + FormatTime(max) + \"ms \" + FormatTime(total) + \"ms\";\n"9577" return str;\n"9578" }\n"9579" StringArray.push(\"\");\n"9580" StringArray.push(\"time count avg max total/\" + AggrFrames + \" \");\n"9581"\n"9582" for(var idx in ProfileData)\n"9583" {\n"9584" if(idx == \"Plot\")\n"9585" continue;\n"9586" var Timer = ProfileData[idx];\n"9587" Timer.AggrCount += Timer.Count;\n"9588" Timer.AggrTime += Timer.Time;\n"9589" Timer.AggrMax = Math.max(Timer.AggrMax, Timer.Time);\n"9590" if(ProfileFpsCount == AggrFrames)\n"9591" {\n"9592" Timer.AvgTime = Timer.AggrTime / AggrFrames;\n"9593" Timer.MaxTime = Timer.AggrMax;\n"9594" Timer.TotalTime = Timer.AggrTime;\n"9595" Timer.AggrCount = 0;\n"9596" Timer.AggrTime = 0;\n"9597" Timer.AggrMax = 0;\n"9598" }\n"9599" StringArray.push(Timer.Name);\n"9600" StringArray.push(FormatStr(Timer.Time, Timer.Count, Timer.AvgTime, Timer.MaxTime, Timer.TotalTime));\n"9601" }\n"9602" var Time = new Date();\n"9603" var Delta = Time - ProfileLastTimeStamp;\n"9604" ProfileLastTimeStamp = Time;\n"9605" StringArray.push(\"Frame Delta\");\n"9606" StringArray.push(Delta + \"ms\");\n"9607" {\n"9608" ProfileFpsAggr += Delta;\n"9609"\n"9610" if(ProfileFpsCount == AggrFrames)\n"9611" {\n"9612" ProfileMs = ProfileFpsAggr / AggrFrames;\n"9613" ProfileFps = 1000 / (ProfileFpsAggr / AggrFrames);\n"9614" ProfileFpsAggr = 0;\n"9615" ProfileFpsCount = 0;\n"9616" }\n"9617" StringArray.push(\"Avg FPS\");\n"9618" StringArray.push(\"\" + ProfileFps.toFixed(2));\n"9619" StringArray.push(\"Avg MS\");\n"9620" StringArray.push(\"\" + ProfileMs.toFixed(2));\n"9621" }\n"9622" for(var i = 0; i < ProfileData.Plot; ++i)\n"9623" {\n"9624" StringArray.push(\"\");\n"9625" StringArray.push(ProfileData.Plot[i]);\n"9626" }\n"9627" ProfileData.Plot = Array();\n"9628" DrawToolTip(StringArray, Canvas, 0, 200);\n"9629" }\n"9630"}\n"9631"\n"9632"\n"9633"\n"9634"function MeasureFont()\n"9635"{\n"9636" var context = CanvasDetailedView.getContext(\'2d\');\n"9637" context.font = Font;\n"9638" FontWidth = context.measureText(\'W\').width;\n"9639"\n"9640"}\n"9641"function ResizeCanvasDPR(w, h, c)\n"9642"{\n"9643" DPR = Settings.AllowHighDPI ? window.devicePixelRatio : 0;\n"9644" if(DPR)\n"9645" {\n"9646" c.style.width = w + \'px\';\n"9647" c.style.height = h + \'px\';\n"9648" c.width = w * DPR;\n"9649" c.height = h * DPR;\n"9650" c.getContext(\'2d\').scale(DPR,DPR);\n"9651" }\n"9652" else\n"9653" {\n"9654" DPR = 1;\n"9655" c.width = w;\n"9656" c.height = h;\n"9657" }\n"9658"\n"9659"}\n"9660"\n"9661"function ResizeCanvasDPR2(w, h, c)\n"9662"{\n"9663" DPR = window.devicePixelRatio;\n"9664" if(DPR)\n"9665" {\n"9666" c.style.width = w + \'px\';\n"9667" c.style.height = h + \'px\';\n"9668" c.width = w * DPR;\n"9669" c.height = h * DPR;\n"9670" c.getContext(\'2d\').scale(DPR,DPR);\n"9671" }\n"9672" else\n"9673" {\n"9674" c.width = w;\n"9675" c.height = h;\n"9676" }\n"9677"\n"9678"}\n"9679"function ResizeView(View, x, y, w, h)\n"9680"{\n"9681" View.x = x;\n"9682" View.y = y;\n"9683" View.w = w;\n"9684" View.h = h;\n"9685" var c0 = View.Canvas[0];\n"9686" var c1 = View.Canvas[1];\n"9687" ResizeCanvasDPR(w, h, c0);\n"9688" ResizeCanvasDPR(w, h, c1);\n"9689" c0.getContext(\'2d\').clearRect(0, 0, w, h);\n"9690" c1.getContext(\'2d\').clearRect(0, 0, w, h);\n"9691" View.OffscreenData[0] = c0.getContext(\'2d\').getImageData(0, 0, c0.width, c0.height);\n"9692" View.OffscreenData[1] = c1.getContext(\'2d\').getImageData(0, 0, c1.width, c1.height);\n"9693"\n"9694"}\n"9695"function CreateView(x, y, w, h, name, DisplayFunc, visible, index)\n"9696"{\n"9697" var idx = Views.length;\n"9698" var c0 = CanvasArray0[idx];\n"9699" var c1 = CanvasArray1[idx];\n"9700" if(!c0)\n"9701" {\n"9702" c0 = document.createElement(\'canvas\');\n"9703" CanvasArray0[idx] = c0;\n"9704" }\n"9705" if(!c1)\n"9706" {\n"9707" c1 = document.createElement(\'canvas\');\n"9708" CanvasArray1[idx] = c1;\n"9709" }\n"9710" var View = {};\n"9711" View.x = x;\n"9712" View.y = y;\n"9713" View.w = w;\n"9714" View.h = h;\n"9715" View.Canvas = [c0, c1];\n"9716" View.OffscreenData = [null, null];\n"9717" View.visible = visible;\n"9718" View.index = index;\n"9719" ResizeCanvasDPR(w, h, c0);\n"9720" ResizeCanvasDPR(w, h, c1);\n"9721"\n"9722" c0.getContext(\'2d\').clearRect(0, 0, w, h);\n"9723" c1.getContext(\'2d\').clearRect(0, 0, w, h);\n"9724" View.OffscreenData[0] = c0.getContext(\'2d\').getImageData(0, 0, c0.width, c0.height);\n"9725" View.OffscreenData[1] = c1.getContext(\'2d\').getImageData(0, 0, c1.width, c1.height);\n"9726" View.BackBuffer = 0;\n"9727" View.DisplayFunc = DisplayFunc;\n"9728" Views.push(View);\n"9729" return View;\n"9730"}\n"9731"\n"9732"function CreateViews(Width, Height, ViewCompressed)\n"9733"{\n"9734" Views = [];\n"9735" var HistoryH = ViewCompressed ? 0 : HistoryHeight;\n"9736" History = CreateView(0, 0, Width, HistoryHeight, \"History\", DrawHistory, true, 0);\n"9737" History.visible = !ViewCompressed;\n"9738" MainView = CreateView(0, HistoryH, Width, Height-HistoryH, \"Main\", DrawGraphSplit, true);\n"9739" X7Views = [];\n"9740" var w = Width / 7;\n"9741" var x = 0;\n"9742" X7Views.push(CreateView(w*0, HistoryH, w, Height - HistoryH, \"x5_0\", DrawBars, false, 0) );\n"9743" X7Views.push(CreateView(w*1, HistoryH, w, Height - HistoryH, \"x5_1\", DrawBars, false, 1) );\n"9744" X7Views.push(CreateView(w*2, HistoryH, w, Height - HistoryH, \"x5_2\", DrawBars, false, 2) );\n"9745" X7Views.push(CreateView(w*3, HistoryH, w, Height - HistoryH, \"x5_3\", DrawBars, false, 3) );\n"9746" X7Views.push(CreateView(w*4, HistoryH, w, Height - HistoryH, \"x5_4\", DrawBars, false, 4) );\n"9747" X7Views.push(CreateView(w*5, HistoryH, w, Height - HistoryH, \"x5_3\", DrawBars, false, 5) );\n"9748" X7Views.push(CreateView(w*6, HistoryH, w, Height - HistoryH, \"x5_3\", DrawBars, false, 6) );\n"9749" X7LegendView = CreateView(0, Height-X7LegendOffset, Width, X7LegendOffset, \"x7_legend\", DrawBarsLegend, false, 0);\n"9750"\n"9751"}\n"9752"\n"9753"function ResizeCanvas()\n"9754"{\n"9755" nWidth = window.innerWidth;\n"9756" nHeight = window.innerHeight;\n"9757" DPR = Settings.AllowHighDPI ? window.devicePixelRatio : 0;\n"9758" ResizeCanvasDPR(nWidth, nHeight, CanvasDetailedView);\n"9759" ResizeCanvasDPR(nWidth, nHeight, CanvasDetailedOffscreen);\n"9760"\n"9761" if(DPR)\n"9762" {\n"9763" CanvasDetailedView.style.width = nWidth + \'px\';\n"9764" CanvasDetailedView.style.height = nHeight + \'px\';\n"9765" CanvasDetailedView.width = nWidth * DPR;\n"9766" CanvasDetailedView.height = nHeight * DPR;\n"9767" CanvasDetailedView.getContext(\'2d\').scale(DPR,DPR);\n"9768"\n"9769" CanvasDetailedOffscreen.style.width = nWidth + \'px\';\n"9770" CanvasDetailedOffscreen.style.height = nHeight + \'px\';\n"9771" CanvasDetailedOffscreen.width = nWidth * DPR;\n"9772" CanvasDetailedOffscreen.height = nHeight * DPR;\n"9773" CanvasDetailedOffscreen.getContext(\'2d\').scale(DPR,DPR);\n"9774"\n"9775" }\n"9776" else\n"9777" {\n"9778" DPR = 1;\n"9779" CanvasDetailedView.width = nWidth;\n"9780" CanvasDetailedView.height = nHeight;\n"9781" CanvasDetailedOffscreen.width = nWidth;\n"9782" CanvasDetailedOffscreen.height = nHeight;\n"9783" }\n"9784" MeasureFont();\n"9785" CreateViews(nWidth, nHeight, Settings.ViewCompressed);\n"9786" ActivateView(Settings.ViewActive);\n"9787"}\n"9788"\n"9789"function FormatTime(Time, Ref)\n"9790"{\n"9791" if(!Ref)\n"9792" {\n"9793" return Time.toFixed(3);\n"9794" }\n"9795" else\n"9796" {\n"9797" let r = 3;\n"9798" if(Ref < 1.0)\n"9799" {\n"9800" r = Math.floor(r + -Math.log(Ref)/ Math.log(10))\n"9801" }\n"9802" return Time.toFixed(r);\n"9803" }\n"9804"}\n"9805"function FormatName(T)\n"9806"{\n"9807" if(T.idtype == TYPE_COUNTER)\n"9808" {\n"9809" return T.countername;\n"9810" }\n"9811" else\n"9812" {\n"9813" return T.name;\n"9814" }\n"9815"}\n"9816"\n"9817"function FormatTimeText(V, T, Ref)\n"9818"{\n"9819" if(T.idtype == TYPE_COUNTER)\n"9820" {\n"9821" return FormatCounter(T.format, V);\n"9822" }\n"9823" else\n"9824" {\n"9825" if(!Ref)\n"9826" {\n"9827" if(T && T.id)\n"9828" {\n"9829" let TimerState = FrameData.TimerMap[T.id];\n"9830" if(TimerState)\n"9831" {\n"9832" let SubGraphSettings = GetSubGraphSettings(GetFullName(T));\n"9833" Ref = GetSubGraphReferenceTime(T, SubGraphSettings, TimerState);\n"9834" }\n"9835" }\n"9836" }\n"9837" return FormatTime(V, Ref) + \"ms\";\n"9838" }\n"9839"}\n"9840"\n"9841"function DrawBarsLegend(View, LocalMouseX, LocalMouseY, SubIndex)\n"9842"{\n"9843" ProfileEnter(\"DrawBar\");\n"9844" var TimerMap = FrameData.TimerMap;\n"9845" if(!TimerMap)\n"9846" return;\n"9847" if(Settings.ViewCompressed)\n"9848" return;\n"9849" var Canvas = View.Canvas[View.BackBuffer];\n"9850" var context = Canvas.getContext(\'2d\');\n"9851" context.clearRect(0, 0, View.w, View.h);\n"9852" var X = 0;\n"9853" var Y = View.h/2;\n"9854" var XSpace = 5;\n"9855" var XSpace2 = XSpace * 2;\n"9856" function DrawEntry(T)\n"9857" {\n"9858" X += XSpace2*2;\n"9859" context.fillStyle = T.color;\n"9860" context.fillRect(X-XSpace,Y-XSpace,XSpace2,XSpace2);\n"9861" X += XSpace + 2;\n"9862" context.fillStyle = \'white\';\n"9863" var w = context.measureText(T.name).width;\n"9864" context.fillText(T.name, X, Y + FontHeight/2);\n"9865" X += w;\n"9866" }\n"9867"\n"9868" if(SingleTimerBars == 0)\n"9869" {\n"9870" for(var key in TimerMap)\n"9871" {\n"9872" var idx = GetTimer(key);\n"9873" var T = TimerArray[idx];\n"9874" if(T.e)\n"9875" {\n"9876" DrawEntry(T);\n"9877" }\n"9878" }\n"9879" }\n"9880" else if(EnabledArray.length > 0)\n"9881" {\n"9882" var idx = EnabledArray[0];\n"9883" var T = TimerArray[idx];\n"9884" DrawEntry(T);\n"9885" }\n"9886"}\n"9887"\n"9888"function DrawBars(View, LocalMouseX, LocalMouseY, SubIndex)\n"9889"{\n"9890" var TimerMap = FrameData.TimerMap;\n"9891" if(!TimerMap)\n"9892" return;\n"9893" if(!SubIndex)\n"9894" SubIndex = 0;\n"9895"\n"9896" ProfileEnter(\"DrawBar\");\n"9897" var Canvas = View.Canvas[View.BackBuffer];\n"9898" var context = Canvas.getContext(\'2d\');\n"9899"\n"9900" context.clearRect(0, 0, View.w, View.h);\n"9901" var bgcolor = nBackColors[ViewIndex%2];\n"9902" context.fillStyle = bgcolor;\n"9903" context.fillRect(0, 0, View.w, View.h);\n"9904" var Title = \"?\";\n"9905" var TitleName = null;\n"9906" var nNumBars = 0;\n"9907" var BarNames = [];\n"9908" var BarTimes = [];\n"9909" var BarColors = [];\n"9910" var AggregateIndex = Settings.AggregateFrames <= 0 ? AggregateHistorySize-1 : AggregateHistorySize-2; //fix med\n"9911" var GetTime = null;\n"9912" var SubIndex = X7BarColumnRemap[SubIndex];\n"9913"\n"9914" if(SingleTimerBars == 0)\n"9915" {\n"9916" if(SubIndex == 0)\n"9917" {\n"9918" Title = \"Time\";\n"9919" GetTime = function(FD){ return FD.FrameTime; };\n"9920" }\n"9921" else if(SubIndex == 1)\n"9922" {\n"9923" Title = \"Average\";\n"9924" GetTime = function(FD){ return FD.TimeAvg[AggregateIndex]; };\n"9925" }\n"9926" else if(SubIndex == 2)\n"9927" {\n"9928" Title = \"Max\";\n"9929" GetTime = function(FD){ return FD.TimeMax[AggregateIndex]; };\n"9930" }\n"9931" else if(SubIndex == 3)\n"9932" {\n"9933" Title = \"Min\";\n"9934" GetTime = function(FD){ return FD.TimeMin[AggregateIndex]; };\n"9935" }\n"9936" else if(SubIndex == 4)\n"9937" {\n"9938" Title = \"Exclusive Avg\";\n"9939" GetTime = function(FD){ return FD.TimeExclAvg[AggregateIndex]; };\n"9940" }\n"9941" else if(SubIndex == 5)\n"9942" {\n"9943" Title = \"Exclusive Max\";\n"9944" GetTime = function(FD){ return FD.TimeExclMax[AggregateIndex]; };\n"9945" }\n"9946" else if(SubIndex == 6)\n"9947" {\n"9948" Title = \"Exclusive Min\";\n"9949" GetTime = function(FD){ return FD.TimeExclMin[AggregateIndex]; };\n"9950" }\n"9951" for(var key in TimerMap)\n"9952" {\n"9953" var idx = GetTimer(key);\n"9954" var T = TimerArray[idx];\n"9955" if(T.e)\n"9956" {\n"9957" nNumBars++;\n"9958" var FD = TimerMap[key];\n"9959" var Time = GetTime(FD);\n"9960" BarNames.push(T.name);\n"9961" BarTimes.push(Time);\n"9962" BarColors.push(T.color);\n"9963" }\n"9964" }\n"9965"\n"9966" }\n"9967" else if(EnabledArray.length > 0)\n"9968" {\n"9969" var idx = EnabledArray[0];\n"9970" var T = TimerArray[idx];\n"9971" var FD = GetFrameData(T.id);\n"9972" var Property = null;\n"9973" if(SubIndex == 0)\n"9974" {\n"9975" Title = \"Average\";\n"9976" Property = \"TimeAvg\";\n"9977" }\n"9978" else if(SubIndex == 1)\n"9979" {\n"9980" Title = \"Max\";\n"9981" Property = \"TimeMax\";\n"9982" }\n"9983" else if(SubIndex == 2)\n"9984" {\n"9985" Title = \"Min\";\n"9986" Property = \"TimeMin\";\n"9987" }\n"9988" else if(SubIndex == 3)\n"9989" {\n"9990" Title = \"Exclusive Average\";\n"9991" Property = \"TimeExclAvg\";\n"9992" }\n"9993" else if(SubIndex == 4)\n"9994" {\n"9995" Title = \"Exclusive Max\";\n"9996" Property = \"TimeExclMax\";\n"9997" }\n"9998" else if(SubIndex == 5)\n"9999" {\n"10000" Title = \"Exclusive Min\";\n"10001" Property = \"TimeExclMin\";\n"10002" }\n"10003" else if(SubIndex == 6)\n"10004" {\n"10005" Title = \"Call Average\";\n"10006" Property = \"TimeCallAvg\";\n"10007" }\n"10008" else if(SubIndex == 7)\n"10009" {\n"10010" Title = \"Call Excl Average\";\n"10011" Property = \"TimeCallExclAvg\";\n"10012" }\n"10013" TitleName = T.name;\n"10014" for(var i = 0; i < AggregateHistorySize; ++i)\n"10015" {\n"10016" nNumBars++;\n"10017" var A = FD[Property];\n"10018" var Time = A[i];\n"10019" BarTimes.push(Time);\n"10020" BarColors.push(T.color);\n"10021" }\n"10022" }\n"10023"\n"10024"\n"10025" if(!nNumBars)\n"10026" {\n"10027" ProfileLeave();\n"10028" return;\n"10029" }\n"10030"\n"10031" var h = View.h;\n"10032" var w = View.w;\n"10033" var MsTextExtraSpace = Math.cos(3.14/4.0) * (ViewBarMaxMsTextLength);\n"10034" var DrawXLeft = Settings.ViewCompressed ? 3 : 15;\n"10035" DrawXLeft = Math.max(DrawXLeft, MsTextExtraSpace);\n"10036" var DrawXRight = Settings.ViewCompressed ? 3: 10;\n"10037" var DrawY = 35 * 2;\n"10038" if(Settings.ViewCompressed)\n"10039" {\n"10040" DrawY = (MsTextExtraSpace) + 35;\n"10041" }\n"10042" var DrawWidth = w - DrawXLeft - DrawXRight;\n"10043" var DrawHeight = h - DrawY;\n"10044" var SpaceWidth = 5;\n"10045" var BarWidth = (DrawWidth-SpaceWidth*(nNumBars-1))/ nNumBars;\n"10046" for(var x = 0; x < 2; ++x)\n"10047" {\n"10048" if(BarWidth < 14)\n"10049" {\n"10050" SpaceWidth -= 1;\n"10051" BarWidth = (DrawWidth-SpaceWidth*(nNumBars-1))/ nNumBars;\n"10052" }\n"10053" }\n"10054" if(BarWidth > 50)\n"10055" BarWidth = 50;\n"10056" var BarHeight = DrawHeight - 5;\n"10057"\n"10058" var ReferenceTime = ReferenceBar;\n"10059"\n"10060" var fHeightScale = h / ReferenceTime;\n"10061" var MouseDragging = 0;\n"10062" var fWidth = w / FRAME_COUNT;\n"10063" var Keys = [];\n"10064" var X = DrawXLeft;\n"10065" var offset = 0;\n"10066" context.textAlign = \'center\';\n"10067" context.fillStyle = \'#ffffff\';\n"10068" context.fillText(Title, w / 2.0, FontHeight);\n"10069" context.textAlign = \'left\';\n"10070" context.fillStyle = \'wheat\';\n"10071" var BaseY = 20;\n"10072" if(SubIndex == X7BarFirstView)\n"10073" {\n"10074" context.fillText(ReferenceTime.toFixed(2) + \'ms\', 0, BaseY - 5 + DrawHeight - BarHeight);\n"10075" }\n"10076" else if(SubIndex == X7BarLastView)\n"10077" {\n"10078" context.textAlign = \'right\';\n"10079" context.fillText(ReferenceTime.toFixed(2) + \'ms\', w, BaseY - 5 + DrawHeight - BarHeight);\n"10080" }\n"10081" context.textAlign = \'right\';\n"10082" var BarFont = FontLarge;\n"10083" var DrawNames = true;\n"10084" if(BarWidth < 14)\n"10085" {\n"10086" DrawNames = BarWidth > 4;\n"10087" var FontXX = \'Bold \' + Math.floor(BarWidth) + \'px Courier New\';\n"10088" BarFont = FontXX;\n"10089"\n"10090" }\n"10091" context.font = BarFont;\n"10092" for(var i = 0; i < BarTimes.length; ++i)\n"10093" {\n"10094" var TimeText = FormatTime(Time);\n"10095" var w = context.measureText(TimeText).width;\n"10096" ViewBarMaxMsTextLength = Math.max(w, ViewBarMaxMsTextLength);\n"10097"\n"10098"\n"10099" }\n"10100" for(var i = 0; i < BarTimes.length; ++i)\n"10101" {\n"10102" var Time = BarTimes[i];\n"10103" var TimeText = FormatTime(Time);\n"10104" ReferenceBarAutomatic = Math.max(Time, ReferenceBarAutomatic);\n"10105" var Color = BarColors[i];\n"10106" var fPrc = Time / ReferenceTime;\n"10107" if(fPrc > 1.0)\n"10108" fPrc = 1.0;\n"10109" var BarH = fPrc * BarHeight;\n"10110"\n"10111" var X0 = X;\n"10112" var Y0 = BaseY + DrawHeight - BarH;\n"10113" context.fillStyle = Color;\n"10114" context.fillRect(X0, Y0, BarWidth, BarH);\n"10115" context.fillStyle = \'#ffffff\';\n"10116" var MouseOver = LocalMouseX > X0 && LocalMouseX < X0 + BarWidth;\n"10117" if(MouseOver || (Settings.ViewCompressed&&DrawNames))\n"10118" {\n"10119" context.save();\n"10120" context.translate(X0 + BarWidth * 0.5, BaseY + DrawHeight - 2);\n"10121" context.rotate(-3.14/2.0);\n"10122" context.font = BarFont;\n"10123" context.textAlign = \'left\';\n"10124" context.textBaseline = \'middle\';\n"10125" var m = context.measureText(BarNames[i]);\n"10126" context.fillStyle = \'black\';\n"10127" context.fillText(BarNames[i], -1, -1);\n"10128" context.fillStyle = \'white\';\n"10129" context.fillText(BarNames[i], 0, 0);\n"10130" context.textAlign = \'right\';\n"10131" context.restore();\n"10132" }\n"10133" context.save();\n"10134" var XText = X+BarWidth;\n"10135" var YText = BaseY + DrawHeight + FontHeight;\n"10136" context.translate(XText, YText);\n"10137" context.rotate(-3.14/4.0);\n"10138" context.font = BarFont;\n"10139" context.fillText(TimeText, 0, 0);\n"10140" context.restore();\n"10141"\n"10142" X += BarWidth + SpaceWidth;\n"10143" }\n"10144" context.font = Font;\n"10145" ProfileLeave();\n"10146"}\n"10147"\n"10148"function SortColumnFromName(Name)\n"10149"{\n"10150" //should match switch in drawtableview\n"10151" if(Name == StrAverage)\n"10152" {\n"10153" return 1;\n"10154" }\n"10155" else if(Name == StrMax)\n"10156" {\n"10157" return 2;\n"10158" }\n"10159" else if(Name == StrTotal)\n"10160" {\n"10161" return 3;\n"10162" }\n"10163" else if(Name == StrMin)\n"10164" {\n"10165" return 4;\n"10166" }\n"10167" else if(Name == StrSpike)\n"10168" {\n"10169" return 5;\n"10170" }\n"10171" else if(Name == StrCallAverage)\n"10172" {\n"10173" return 6;\n"10174" }\n"10175" else if(Name == StrCount)\n"10176" {\n"10177" return 7;\n"10178" }\n"10179" else if(Name == StrExclAverage)\n"10180" {\n"10181" return 8;\n"10182" }\n"10183" else if(Name == StrExclMax)\n"10184" {\n"10185" return 9;\n"10186" }\n"10187" else if(Name == StrGroup)\n"10188" {\n"10189" return -1;\n"10190" }\n"10191" else if(Name == StrTimer)\n"10192" {\n"10193" return -2;\n"10194" }\n"10195" return 0;\n"10196"}\n"10197"\n"10198"\n"10199"function DrawTableView(View, LocalMouseX, LocalMouseY, SubIndex)\n"10200"{\n"10201" ProfileEnter(\"DrawTableView\");\n"10202" let Canvas = View.Canvas[View.BackBuffer];\n"10203" let context = Canvas.getContext(\'2d\');\n"10204" let Height = BoxHeight;\n"10205" let Width = nWidth;\n"10206" let Y = Height;\n"10207" let XBase = 0;\n"10208" let nColorIndex = 0;\n"10209" let bMouseIn = 0;\n"10210" let RcpReferenceTime = 1.0 / Settings.ReferenceTime;\n"10211" let CountWidth = 12 * FontWidth;\n"10212" let InnerBoxHeight = BoxHeight-2;\n"10213" let TimerLen = 8;\n"10214" let TimerWidth = TimerLen * FontWidth;\n"10215" let nWidthBars = nBarsWidth+2;\n"10216" let nWidthMs = TimerWidth+2+10;\n"10217" let NameWidth = 200;\n"10218" let R = 0;\n"10219" let X = 0;\n"10220"\n"10221" let OffsetY = BoxHeight;\n"10222"\n"10223"\n"10224" context.clearRect(0, 0, View.w, View.h);\n"10225" context.fillStyle = \'white\';\n"10226" context";1022710228const size_t g_MicroProfileHtmlLive_begin_0_size = sizeof(g_MicroProfileHtmlLive_begin_0);10229const char g_MicroProfileHtmlLive_begin_1[] =10230".font = Font;\n"10231"\n"10232"\n"10233" function HeaderMouseHandle(XBegin, X, Y, Header)\n"10234" {\n"10235" if(Header == null)\n"10236" debugger;\n"10237" let bMouseIn = LocalMouseY >= Y && LocalMouseY < BoxHeight+Y && LocalMouseX < X && LocalMouseX > XBegin;\n"10238" if(bMouseIn)\n"10239" {\n"10240" SortColumnMouseOverNext = Header;\n"10241" }\n"10242" }\n"10243" function HeaderString(Header)\n"10244" {\n"10245" if(Header == Settings.SortColumnName)\n"10246" {\n"10247" return Header + (Settings.SortColumnOrderFlip ? \'<\' : \'>\');\n"10248" }\n"10249" else\n"10250" {\n"10251" return Header;\n"10252" }\n"10253"\n"10254" }\n"10255" function DrawHeaderSplit(Header, Y)\n"10256" {\n"10257" if(Settings.BarColumnEnabledTable[R])\n"10258" {\n"10259" context.fillStyle = \'white\';\n"10260" context.fillText(HeaderString(Header), X, Y + Height-FontAscent);\n"10261" var XBegin = X;\n"10262" X += nWidthBars;\n"10263" context.fillStyle = nBackColorOffset;\n"10264" X += ColumnsWidth[R];\n"10265"\n"10266" if(X >= NameWidth)\n"10267" {\n"10268" context.fillRect(X-3, Y, 1, nHeight);\n"10269" }\n"10270" HeaderMouseHandle(XBegin, X, Y, Header);\n"10271" }\n"10272" R++;\n"10273" }\n"10274" function DrawHeaderSplitSingle(Header, Y)\n"10275" {\n"10276" if(Settings.BarColumnEnabledTable[R])\n"10277" {\n"10278" context.fillStyle = \'white\';\n"10279" context.fillText(HeaderString(Header), X, Y + Height-FontAscent);\n"10280" let XBegin = X;\n"10281" X += ColumnsWidth[R];\n"10282" context.fillStyle = nBackColorOffset;\n"10283" if(X >= NameWidth)\n"10284" {\n"10285" context.fillRect(X-3, Y, 1, nHeight);\n"10286" }\n"10287" HeaderMouseHandle(XBegin, X, Y, Header);\n"10288" }\n"10289" R++;\n"10290" }\n"10291" function DrawHeaderSplitLeftRight(HeaderLeft, HeaderRight, Y, Width)\n"10292" {\n"10293" let HeaderLeftS = HeaderString(HeaderLeft);\n"10294" let HeaderRightS = HeaderString(HeaderRight);\n"10295" context.textAlign = \'left\';\n"10296" context.fillStyle = \'white\';\n"10297" context.fillText(HeaderLeftS, X, Y + Height-FontAscent);\n"10298" let wLeft = context.measureText(HeaderLeftS).width;\n"10299" let XBegin = X;\n"10300" X += Width;\n"10301" context.textAlign = \'right\';\n"10302" context.fillText(HeaderRightS, X-5, Y + Height-FontAscent);\n"10303" context.textAlign = \'left\';\n"10304" context.fillStyle = nBackColorOffset;\n"10305" if(X >= NameWidth)\n"10306" {\n"10307" context.fillRect(X-3, 0, 1, nHeight);\n"10308" }\n"10309" HeaderMouseHandle(XBegin, XBegin + wLeft, Y, HeaderLeft);\n"10310" HeaderMouseHandle(XBegin + wLeft, X, Y, HeaderRight);\n"10311"\n"10312" }\n"10313" function DrawTimer(Value, Color, Skip)\n"10314" {\n"10315" if(Settings.BarColumnEnabledTable[R])\n"10316" {\n"10317" if(Skip)\n"10318" {\n"10319" X += nWidthBars;\n"10320" X += ColumnsWidth[R];\n"10321" }\n"10322" else\n"10323" {\n"10324" if(null == Value)\n"10325" {\n"10326" X += nWidthBars + ColumnsWidth[R];\n"10327" console.log(\"Should not happen2\\n\");\n"10328" debugger;\n"10329" return;\n"10330" }\n"10331" let Prc = Math.max(0, Value) * RcpReferenceTime;\n"10332" let YText = Y+Height-FontAscent;\n"10333" if(Prc > 1)\n"10334" {\n"10335" Prc = 1;\n"10336" }\n"10337" context.textAlign = \'left\';\n"10338" context.fillStyle = Color;\n"10339" context.fillRect(X+1, Y+1, Prc * nBarsWidth, InnerBoxHeight);\n"10340" X += nWidthBars;\n"10341" context.fillStyle = \'white\';\n"10342" let TimerText = FormatTime(Value);\n"10343" let W = context.measureText(TimerText).width + FontWidth;\n"10344" ColumnsWidth[R] = Math.max(W, ColumnsWidth[R]);\n"10345" X += ColumnsWidth[R];\n"10346" context.textAlign = \'right\';\n"10347" context.fillText(TimerText, X - FontWidth, YText);\n"10348" context.textAlign = \'left\';\n"10349" }\n"10350" }\n"10351" R++;\n"10352" }\n"10353" function DrawCount(Str, Skip)\n"10354" {\n"10355" if(Settings.BarColumnEnabledTable[R])\n"10356" {\n"10357" X += ColumnsWidth[R];\n"10358" let W = Math.max(80, context.measureText(Str).width + FontWidth * 2);\n"10359" ColumnsWidth[R] = Math.max(W, ColumnsWidth[R]);\n"10360" if(!Skip)\n"10361" {\n"10362" context.fillStyle = \'white\';\n"10363" context.textAlign = \'right\';\n"10364" let YText = Y+Height-FontAscent;\n"10365" context.fillText(Str, X-6, YText);\n"10366" }\n"10367" }\n"10368" R++;\n"10369"\n"10370" }\n"10371" function DrawMeta(Value, Width, Dec, YText)\n"10372" {\n"10373" Value = FormatMeta(Value, Dec);\n"10374" X += (FontWidth*Width);\n"10375" context.textAlign = \'right\';\n"10376" context.fillText(Value, X-FontWidth, YText);\n"10377" context.textAlign = \'left\';\n"10378" }\n"10379"\n"10380" function DrawTimerRow(idx, showgroup)\n"10381" {\n"10382" R = 0;\n"10383" let T = TimerArray[idx];\n"10384" let IsCounter = T.idtype == TYPE_COUNTER;\n"10385" let key = T.id;\n"10386" let FD = TimerMap[key];\n"10387" let AggregateIndex = Settings.AggregateFrames <= 0 ? AggregateHistorySize-1 : AggregateHistorySize-2;\n"10388"\n"10389" let YText = Y+Height-FontAscent;\n"10390" X = NameWidth + XBase;\n"10391"\n"10392" nColorIndex = 1-nColorIndex;\n"10393" bMouseIn = LocalMouseY >= Y && LocalMouseY < Y + BoxHeight;\n"10394" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"10395" context.fillRect(0, Y, Width, FontHeight+2);\n"10396"\n"10397" DrawTimer(T.time, T.color);\n"10398" DrawTimer(T.excl, T.color, IsCounter);\n"10399"\n"10400" DrawTimer(T.average, T.color);\n"10401" DrawTimer(T.max, T.color);\n"10402" DrawTimer(T.min, T.color);\n"10403" DrawTimer(T.total, T.color);\n"10404"\n"10405" DrawTimer(T.exclaverage, T.color, IsCounter);\n"10406" DrawTimer(T.exclmax, T.color, IsCounter);\n"10407" DrawTimer(T.excltotal, T.color, IsCounter);\n"10408"\n"10409" DrawCount((T.spike?T.spike.toFixed(2):\"0\") + \'%\', IsCounter);\n"10410" DrawTimer(T.callaverage, T.color, IsCounter);\n"10411" DrawTimer(T.callexclaverage, T.color, IsCounter);\n"10412" DrawCount(\'\' + T.callcount, IsCounter);\n"10413"\n"10414" context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"10415" context.fillRect(0, Y, NameWidth, Height);\n"10416" if(T.idtype == TYPE_GROUP)\n"10417" {\n"10418" context.textAlign = \'left\';\n"10419" context.fillStyle = T.color;\n"10420" context.fillText(T.name, 1, YText);\n"10421" }\n"10422" else if(T.idtype == TYPE_COUNTER)\n"10423" {\n"10424" context.textAlign = \'left\';\n"10425" context.fillStyle = T.color;\n"10426" context.fillText(T.countername, 1, YText);\n"10427" }\n"10428" else\n"10429" {\n"10430" context.textAlign = \'right\';\n"10431" context.fillStyle = T.color;\n"10432" context.fillText(T.name, NameWidth - 5, YText);\n"10433" context.textAlign = \'left\';\n"10434" let P = TimerArray[T.parent];\n"10435" context.fillStyle = P.color;\n"10436" let ParentName = P.name;\n"10437" context.fillText(ParentName, 1, YText);\n"10438" }\n"10439" }\n"10440" function FilterMatch(FilterArray, value)\n"10441" {\n"10442" if(!FilterArray)\n"10443" return true;\n"10444" for(let i = 0; i < FilterArray.length; ++i)\n"10445" {\n"10446" let res = value.search(FilterArray[i]);\n"10447" if(res<0)\n"10448" return false;\n"10449" }\n"10450" return true;\n"10451" }\n"10452" let TimerMap = FrameData.TimerMap;\n"10453" if(!TimerMap)\n"10454" {\n"10455" return;\n"10456" }\n"10457"\n"10458" let wfirst = 100;\n"10459" let OrderArray = new Array();\n"10460" let nTotalRows = 0;\n"10461" for(let key in TimerMap)\n"10462" {\n"10463" let idx = GetTimer(key);\n"10464" let T = TimerArray[idx];\n"10465" if(T.e)\n"10466" {\n"10467" OrderArray.push(idx);\n"10468" wfirst = wfirst < T.wtotal ? T.wtotal : wfirst;\n"10469" nTotalRows++;\n"10470" }\n"10471" }\n"10472" NameWidth = wfirst + 20;\n"10473"\n"10474"\n"10475" let nTotalRowPixels = (3+nTotalRows) * Height;\n"10476" let nFrameRows = nHeight - HistoryHeight - BoxHeight;\n"10477" if(nTotalRowPixels > nFrameRows)\n"10478" {\n"10479" if(nOffsetBarsY + nFrameRows > nTotalRowPixels)\n"10480" {\n"10481" nOffsetBarsY = nTotalRowPixels - nFrameRows;\n"10482" }\n"10483" }\n"10484" else\n"10485" {\n"10486" nOffsetBarsY = 0;\n"10487" }\n"10488" Y = Y - nOffsetBarsY;\n"10489" Y += OffsetY;\n"10490" XBase = XBase - nOffsetBarsX;\n"10491"\n"10492" if(1)\n"10493" {\n"10494" let Flip = Settings.SortColumnOrderFlip == 1 ? -1 : 1;\n"10495" let StringCompare = function(Key)\n"10496" {\n"10497" let F = function(A, B)\n"10498" {\n"10499" let s1 = Key(A);\n"10500" let s2 = Key(B);\n"10501" return Flip * s2.localeCompare(s1);\n"10502" };\n"10503" return F;\n"10504" };\n"10505" let NumberCompare = function(Key)\n"10506" {\n"10507" let F = function(A, B)\n"10508" {\n"10509" let v0 = Key(B);\n"10510" let v1 = Key(A);\n"10511" return Flip * (v0 - v1);\n"10512" };\n"10513" return F;\n"10514" };\n"10515" let N = Settings.SortColumnName;\n"10516" if(N == StrTime)\n"10517" {\n"10518" let Do = function()\n"10519" {\n"10520" for(var i = 0; i < OrderArray.length; ++i)\n"10521" {\n"10522" let t = TimerArray[OrderArray[i]];\n"10523" console.log(\"\", i, OrderArray[i], t.name, t.id, t.time);\n"10524" };\n"10525"\n"10526" };\n"10527" OrderArray.sort( NumberCompare( function (a) {\n"10528" return TimerArray[a].time;\n"10529" } ) );\n"10530" }\n"10531" else if(N == StrExclusive)\n"10532" {\n"10533" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].excl; } ) );\n"10534" }\n"10535" else if(N == StrAverage)\n"10536" {\n"10537" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].average; } ) );\n"10538" }\n"10539" else if(N == StrMax)\n"10540" {\n"10541" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].max; } ) );\n"10542" }\n"10543" else if(N == StrTotal)\n"10544" {\n"10545" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].total; } ) );\n"10546" }\n"10547" else if(N == StrMin)\n"10548" {\n"10549" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].min; } ) );\n"10550" }\n"10551" else if(N == StrSpike)\n"10552" {\n"10553" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].spike; } ) );\n"10554" }\n"10555" else if(N == StrCallAverage)\n"10556" {\n"10557" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].callaverage; } ) );\n"10558" }\n"10559" else if(N == StrCount)\n"10560" {\n"10561" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].count; } ) );\n"10562" }\n"10563" else if(N == StrExclAverage)\n"10564" {\n"10565" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].exclaverage; } ) );\n"10566" }\n"10567" else if(N == StrExclMax)\n"10568" {\n"10569" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].exclmax; } ) );\n"10570" }\n"10571" else if(N == StrExclTotal)\n"10572" {\n"10573" OrderArray.sort( NumberCompare( function (a) { return TimerArray[a].excltotal; } ) );\n"10574" }\n"10575" else if(N == StrGroup)\n"10576" {\n"10577" OrderArray.sort( StringCompare( function (a) { return TimerArray[TimerArray[a].parent].name; } ) );\n"10578" }\n"10579" else if(N == StrTimer)\n"10580" {\n"10581" OrderArray.sort( StringCompare( function (a) { return TimerArray[a].name; } ) );\n"10582" }\n"10583" else\n"10584" {\n"10585" if(N != \"\")\n"10586" {\n"10587" console.log(\"unhandle sortkey\", N);\n"10588" debugger;\n"10589" }\n"10590"\n"10591" OrderArray.sort( StringCompare( function (a) { return TimerArray[a].sortkey; } ) );\n"10592" }\n"10593" }\n"10594"\n"10595" let ColorHigh = \'#85929e\';\n"10596"\n"10597"\n"10598" for(let i = 0; i < OrderArray.length; ++i)\n"10599" {\n"10600" let idx = OrderArray[i];\n"10601" let T = TimerArray[idx];\n"10602" if(T.idtype == TYPE_GROUP)\n"10603" {\n"10604" DrawTimerRow(idx, 1);\n"10605" Y += Height;\n"10606" }\n"10607" }\n"10608" let SplitY0 = Y;\n"10609"\n"10610" for(let i = 0; i < OrderArray.length; ++i)\n"10611" {\n"10612" let idx = OrderArray[i];\n"10613" let T = TimerArray[idx];\n"10614" if(T.idtype == TYPE_TIMER)\n"10615" {\n"10616" DrawTimerRow(idx, 1);\n"10617" Y += Height;\n"10618" }\n"10619" }\n"10620" let SplitY1 = Y;\n"10621"\n"10622" for(let i = 0; i < OrderArray.length; ++i)\n"10623" {\n"10624" let idx = OrderArray[i];\n"10625" let T = TimerArray[idx];\n"10626" if(T.idtype == TYPE_COUNTER)\n"10627" {\n"10628" DrawTimerRow(idx, 1);\n"10629" Y += Height;\n"10630" }\n"10631" }\n"10632"\n"10633" \n"10634" context.fillStyle = nBackColorOffset;\n"10635" context.fillRect(0, 0, Width, 2*Height);\n"10636" context.fillStyle = \'white\';\n"10637" SortColumnMouseOverNext = null;\n"10638" X = NameWidth + XBase;\n"10639" R = 0;\n"10640"\n"10641" let Aggr = Settings.AggregateFrames <= 0 ? AggregateCurrent : Settings.AggregateFrames;\n"10642" let Headers = [\"Per Frame\", \"Aggregate/\" + Aggr + \" Frames\", \"Call/\" + Aggr + \" Frames\"];\n"10643" let SplitX = [0,0,0];\n"10644"\n"10645" DrawHeaderSplit(StrTime,OffsetY);\n"10646" DrawHeaderSplit(StrExclusive, OffsetY);\n"10647" SplitX[0] = X;\n"10648"\n"10649" DrawHeaderSplit(StrAverage, OffsetY);\n"10650" DrawHeaderSplit(StrMax, OffsetY);\n"10651" DrawHeaderSplit(StrMin, OffsetY);\n"10652" DrawHeaderSplit(StrTotal, OffsetY);\n"10653"\n"10654" DrawHeaderSplit(StrExclAverage, OffsetY);\n"10655" DrawHeaderSplit(StrExclMax, OffsetY);\n"10656" DrawHeaderSplit(StrExclTotal, OffsetY);\n"10657"\n"10658" DrawHeaderSplitSingle(StrSpike, OffsetY);\n"10659" SplitX[1] = X;\n"10660"\n"10661" DrawHeaderSplit(StrCallAverage, OffsetY);\n"10662" DrawHeaderSplit(StrCallExclAverage, OffsetY);\n"10663" DrawHeaderSplitSingle(StrCount, OffsetY);\n"10664" SplitX[2] = X;\n"10665"\n"10666" context.fillStyle = \'white\';\n"10667" for(let i = 0; i < SplitX.length; ++i)\n"10668" {\n"10669" let X0 = i == 0 ? (NameWidth + XBase) : SplitX[i-1];\n"10670" let X1 = SplitX[i];\n"10671" if(X0 != X1)\n"10672" {\n"10673" context.fillText(Headers[i], X0 + 1, Height-FontAscent);\n"10674" }\n"10675" }\n"10676" X = 0;\n"10677" context.fillStyle = nBackColorOffset;\n"10678" context.fillRect(0, 0, NameWidth, Height * 2);\n"10679" context.fillStyle = \'white\';\n"10680" DrawHeaderSplitLeftRight(StrGroup, StrTimer, 0, NameWidth);\n"10681"\n"10682"\n"10683" for(let i = 0; i < SplitX.length; ++i)\n"10684" {\n"10685" let X0 = i == 0 ? (NameWidth + XBase) : SplitX[i-1];\n"10686" let X1 = SplitX[i];\n"10687" if(X0 != X1)\n"10688" {\n"10689" context.fillStyle = ColorHigh;\n"10690" if(X1 >= NameWidth)\n"10691" context.fillRect(X1-2.5, 0, 2, nHeight);\n"10692" if(X0 >= NameWidth)\n"10693" context.fillRect(X0-2.5, 0, 2, nHeight);\n"10694" }\n"10695" }\n"10696" context.fillStyle = ColorHigh;\n"10697" context.fillRect(0, 2*Height-1, nWidth, 2);\n"10698"\n"10699" context.fillStyle = ColorHigh;\n"10700" context.fillRect(0, SplitY0-1, nWidth, 2);\n"10701" context.fillRect(0, SplitY1-1, nWidth, 2);\n"10702"\n"10703"\n"10704" ProfileLeave();\n"10705"}\n"10706"function DrawGraphThreadGroup(View, LocalMouseX, LocalMouseY, SubIndex)\n"10707"{\n"10708" DrawGraphThreadExclusive(View, LocalMouseX, LocalMouseY, SubIndex);\n"10709"}\n"10710"function DrawGraphSplit(View, LocalMouseX, LocalMouseY, SubIndex)\n"10711"{\n"10712" DrawGraph(View, LocalMouseX, LocalMouseY, SubIndex, 1);\n"10713"}\n"10714"\n"10715"function DrawGraphThreadExclusive(View, LocalMouseX, LocalMouseY, SubIndex, Split)\n"10716"{\n"10717" var TimerMap = FrameData.TimerMap;\n"10718" if(!TimerMap)\n"10719" return;\n"10720"\n"10721" ProfileEnter(\"DrawGraphThreadExclusive\");\n"10722" var Canvas = View.Canvas[View.BackBuffer];\n"10723" var context = Canvas.getContext(\'2d\');\n"10724" context.clearRect(0, 0, View.w, View.h);\n"10725"\n"10726" var h = View.h;\n"10727" var w = View.w;\n"10728" var fHeightScale = h / ReferenceGraph;\n"10729" var MouseDragging = 0;\n"10730" var fWidth = w / FRAME_COUNT;\n"10731" var MouseTime = ReferenceGraph * (1-(LocalMouseY / h));\n"10732" var HighlightKey = 0;\n"10733" var HighlightFrame = -1;\n"10734"\n"10735"\n"10736" var NumGraphs = 0;\n"10737" for(let k in ThreadInfo)\n"10738" {\n"10739" NumGraphs++;\n"10740" }\n"10741" if(NumGraphs)\n"10742" {\n"10743" let hstart = 0;\n"10744" let gh = h / NumGraphs;\n"10745" let cidx = 1;\n"10746" let Count = FRAME_COUNT;\n"10747" let Last = AllocClearedArray(Count);\n"10748" let FT = FrameData.Time;\n"10749" let RcpFT = AllocClearedArray(Count);\n"10750" if(FT.length != RcpFT.length)\n"10751" debugger;\n"10752" for(let k = 0; k < RcpFT.length; ++k)\n"10753" {\n"10754" if(FT[k] != 0)\n"10755" {\n"10756" RcpFT[k] = 1.0 / FT[k];\n"10757" }\n"10758" else\n"10759" {\n"10760" RcpFT[k] = 0;\n"10761" }\n"10762" }\n"10763"\n"10764" for(let k in ThreadInfo)\n"10765" {\n"10766" for(let j = 0; j < Last.length; ++j)\n"10767" Last[j] = 0.0;\n"10768" let TI = ThreadInfo[k];\n"10769" let X = 0;\n"10770" let Y = hstart + gh;\n"10771" var YStart = Y;\n"10772" if(LocalMouseX >= 0 && LocalMouseY >= hstart && LocalMouseX < w && LocalMouseY <= Y)\n"10773" {\n"10774" HighlightKey = k;\n"10775" HighlightFrame = Math.floor(FRAME_COUNT * LocalMouseX / w);\n"10776" }\n"10777"\n"10778"\n"10779" context.globalAlpha = 1;\n"10780" context.fillStyle = nBackColorsDark[cidx];\n"10781" cidx = 1-cidx;\n"10782" context.fillRect(0, hstart, w, gh);\n"10783" context.strokeStyle = \'white\';\n"10784" context.fillStyle = \'white\';\n"10785" for(let l = 0; l < TI.a.length; ++l)\n"10786" {\n"10787" X = 0;\n"10788" let a = TI.a[l];\n"10789" if(a.length != Count)\n"10790" {\n"10791" console.log(\"should not happen!\\n\");\n"10792" debugger;\n"10793" }\n"10794" let idx = GetTimer(TI.ids[l]);\n"10795" let c = TimerArray[idx].color;\n"10796" context.strokeStyle = c;\n"10797" context.fillStyle = c;\n"10798" context.beginPath();\n"10799"\n"10800" for(let m = Last.length-1;m >= 0; m--)\n"10801" {\n"10802" let XX = X + fWidth * m;\n"10803" Y = Math.max(YStart - Last[m] * gh, hstart);\n"10804" if(m == Last.length-1)\n"10805" {\n"10806" context.moveTo(XX, Y);\n"10807" }\n"10808" else\n"10809" {\n"10810" context.lineTo(XX, Y);\n"10811" }\n"10812" }\n"10813"\n"10814" for(let m = 0; m < a.length; ++m)\n"10815" {\n"10816"\n"10817" let h = a[m] * RcpFT[m];\n"10818" if(h > 1.1)\n"10819" {\n"10820" console.log(\"should not happen \", a[m], RcpFT[m], h);\n"10821" debugger;\n"10822" h = 1;\n"10823" //todo...\n"10824" }\n"10825" let hm = h + Last[m];\n"10826" if(hm > 1.1)\n"10827" {\n"10828" console.log(\"should not happen \", hm, h, Last[m]);\n"10829" debugger;\n"10830" hm = 1;\n"10831" //todo...\n"10832" }\n"10833" Y = Math.max(YStart - hm * gh, hstart);\n"10834" context.lineTo(X, Y);\n"10835" X += fWidth;\n"10836" Last[m] = hm;\n"10837" }\n"10838" context.fill();\n"10839"\n"10840" }\n"10841" context.fillStyle = \'wheat\';\n"10842" context.textAlign=\'right\';\n"10843" context.fillText(\'100%\', nWidth, hstart + FontHeight);\n"10844" context.textAlign=\'left\';\n"10845" context.fillText(TI.n, 0, hstart + FontHeight);\n"10846" hstart += gh;\n"10847" }\n"10848" }\n"10849"\n"10850" if(HighlightKey != 0 && SubMenuActive == -1)\n"10851" {\n"10852" ToolTipCallback = function(canvas, x, y)\n"10853" {\n"10854" let TI = ThreadInfo[HighlightKey];\n"10855" let ret = [];\n"10856" let colors = [];\n"10857" for(let l = 0; l < TI.a.length; ++l)\n"10858" {\n"10859" let a = TI.a[l];\n"10860" let idx = GetTimer(TI.ids[l]);\n"10861" let c = TimerArray[idx].color;\n"10862" colors.push(c);\n"10863" ret.push(TimerArray[idx].name);\n"10864" let t = FormatTime(a[HighlightFrame]) + \'ms\';\n"10865" colors.push(\'white\');\n"10866" ret.push(t);\n"10867" }\n"10868" return {c:colors, a:ret};\n"10869" }\n"10870" }\n"10871"\n"10872" ProfileLeave();\n"10873"}\n"10874"\n"10875"function DrawGraphPercentile(View, LocalMouseX, LocalMouseY, SubIndex)\n"10876"{\n"10877" let TimerMap = FrameData.TimerMap;\n"10878" if(!TimerMap)\n"10879" return;\n"10880"\n"10881" ProfileEnter(\"DrawGraphPercentile\");\n"10882" let Canvas = View.Canvas[View.BackBuffer];\n"10883" let context = Canvas.getContext(\'2d\');\n"10884" context.clearRect(0, 0, View.w, View.h);\n"10885"\n"10886" let h = View.h;\n"10887" let w = View.w;\n"10888" let Keys = SortGraphs();\n"10889" let NumGraphs = Keys.length;\n"10890" let ToolTips = Array();\n"10891" if(NumGraphs)\n"10892" {\n"10893" let hstart = 0;\n"10894" let gh = h / NumGraphs;\n"10895" let cidx = 1;\n"10896"\n"10897" if(LocalMouseX >= 0 && LocalMouseY >= 0 && LocalMouseX < w && LocalMouseY < h && SubMenuActive == -1)\n"10898" {\n"10899" ToolTipCallback = function(canvas, x, y)\n"10900" {\n"10901" let TimerMap = FrameData.TimerMap;\n"10902" let context = canvas.getContext(\'2d\');\n"10903" context.font = Font;\n"10904" let XPos = x - 20;\n"10905" for(let key in TimerMap)\n"10906" {\n"10907" let idx = GetTimer(key);\n"10908" let TimerState = TimerMap[key];\n"10909" let T = TimerArray[idx];\n"10910" if(!IsGroup(key) && T.e && TimerState.PercentileMax > TimerState.PercentileMin)\n"10911" {\n"10912" let HighlightIndex = -1;\n"10913" let Max = TimerState.PercentileMax;\n"10914" let Min = TimerState.PercentileMin;\n"10915" let h = View.h;\n"10916" let w = View.w;\n"10917" let tooltipstring = TimerState.tooltipstring;\n"10918"\n"10919" if(LocalMouseX >= 0 && LocalMouseY >= 0 && LocalMouseX < w && LocalMouseY < h && SubMenuActive == -1 && tooltipstring)\n"10920" {\n"10921" if(TimerState.tooltipysoft)\n"10922" {\n"10923" let RATE = 0.05;\n"10924" if(Math.abs(TimerState.tooltipysoft - TimerState.tooltipy) > 6)\n"10925" {\n"10926" TimerState.tooltipysoft = TimerState.tooltipy * RATE + TimerState.tooltipysoft * (1-RATE);\n"10927" }\n"10928" }\n"10929" else\n"10930" {\n"10931" TimerState.tooltipysoft = TimerState.tooltipy;\n"10932" }\n"10933" let Y = TimerState.tooltipysoft;\n"10934" let wtext = context.measureText(tooltipstring, XPos, Y).width;\n"10935" let X = Math.max(0, XPos - wtext);\n"10936" context.fillStyle = \'black\';\n"10937" context.fillRect(X - 1, Y-1 , wtext+2, BoxHeight+2);\n"10938" context.fillStyle = \'white\';\n"10939" context.textAlign = \'right\';\n"10940" context.fillText(tooltipstring, X + wtext, Y+BoxHeight-2);\n"10941"\n"10942" }\n"10943" }\n"10944" context.textAlign = \'left\';\n"10945" }\n"10946" }\n"10947" }\n"10948"\n"10949" for(let index in Keys)\n"10950" {\n"10951" let key = Keys[index];\n"10952" let idx = GetTimer(key);\n"10953" let T = TimerArray[idx];\n"10954" let TimerState = TimerMap[key];\n"10955" TimerState.tooltipstring = null;\n"10956" let Valid = TimerState.PercentileMax > TimerState.PercentileMin;\n"10957" if(!IsGroup(key) && T.e)\n"10958" {\n"10959" let Max = Valid ? TimerState.PercentileMax : 1;\n"10960" let Min = Valid ? TimerState.PercentileMin : 0;\n"10961" let SubGraphSettings = GetSubGraphSettings(GetFullName(T));\n"10962" let Percentile = 0.0;\n"10963" if(Percentile == null)\n"10964" Percentile = 0.0;\n"10965" Percentile = Math.max(0.0, Math.min(99.0, Percentile));\n"10966" if(!SubGraphSettings.AutomaticReference)\n"10967" {\n"10968" Max = SubGraphSettings.ReferenceTime;\n"10969" }\n"10970" let Reference = Max;\n"10971" let PercentileData = TimerState.Percentile;\n"10972" let PercentileCount = TimerState.PercentileCount;\n"10973" let BasePrc = 0;\n"10974" if(PercentileCount > PERCENTILE_SAMPLES)\n"10975" {\n"10976" BasePrc = 100 * (1- PERCENTILE_SAMPLES / PercentileCount);\n"10977" }\n"10978" let Total = PercentileData.length-1;\n"10979" let NumElementsOnScreen = Total * (100 - Percentile) / (100);\n"10980" let WidthPerElement = w / NumElementsOnScreen;\n"10981" let TotalWidth = Total * WidthPerElement;\n"10982" let PercentilePrc = Percentile / 100;\n"10983" let PercentileOffset = PercentilePrc * TotalWidth;\n"10984" let fHeightScale2 = gh / Max;\n"10985" let color = T.color;\n"10986" let X = 0;\n"10987" let Y = hstart + gh;\n"10988" let YStart = Y;\n"10989" let MouseInside = LocalMouseX >= 0 && LocalMouseY >= 0 && LocalMouseX < w && LocalMouseY < h && SubMenuActive == -1;\n"10990"\n"10991" context.globalAlpha = 1;\n"10992" context.fillStyle = nBackColorsDark[cidx];\n"10993" cidx = 1-cidx;\n"10994" context.fillRect(0, hstart, w, gh);\n"10995" context.strokeStyle = color;\n"10996" context.fillStyle = color;\n"10997" let PercentileStart = Math.max(0, Math.floor(0.01*Percentile / PercentileData.length));\n"10998" {\n"10999" context.beginPath();\n"11000" context.moveTo(X,Y);\n"11001" for(let i = PercentileStart; i < PercentileData.length; ++i)\n"11002" {\n"11003" X = i * WidthPerElement - PercentileOffset;\n"11004" Y = Math.max(YStart - PercentileData[i] * fHeightScale2, hstart);\n"11005" context.lineTo(X, Y);\n"11006" }\n"11007" context.stroke();\n"11008" context.lineTo(X, YStart);\n"11009" context.globalAlpha = GRAPH_ALPHA;\n"11010" context.fill();\n"11011" }\n"11012" context.globalAlpha = 1;\n"11013" context.fillStyle = \'wheat\';\n"11014" context.textAlign=\'right\';\n"11015" context.fillText(FormatTimeText(Reference, T), nWidth, hstart + FontHeight);\n"11016" context.fillText(\'100%\', nWidth, hstart + gh-2);\n"11017" context.textAlign=\'centered\';\n"11018" Percentile = BasePrc;\n"11019" context.fillText( ((Percentile + 100)/2).toFixed(2) + \'%\', nWidth/2, hstart + gh-2);\n"11020" context.textAlign=\'left\';\n"11021" context.fillText(Percentile.toFixed(2) + \"% [Samples:\" + PercentileCount + \"]\", 0, hstart + gh-2);\n"11022" context.fillText(FormatName(T), 15, hstart + FontHeight);\n"11023" context.fillText(Percentile + \'%\', nWidth, hstart + FontHeight);\n"11024"\n"11025" if(MouseInside)\n"11026" {\n"11027" let Element = (PercentileOffset + LocalMouseX) / WidthPerElement;\n"11028" let Rounded = Math.round(Element);\n"11029" let HighlightIndex = Math.max(0, Math.min(Rounded, PercentileData.length-1));\n"11030" X = HighlightIndex * WidthPerElement - PercentileOffset;\n"11031" let Y = YStart - Math.min(PercentileData[HighlightIndex], Reference) * fHeightScale2;\n"11032" context.strokeStyle = color;\n"11033" context.beginPath();\n"11034" let CrossX = X;\n"11035" let CrossY = Y;\n"11036" context.moveTo(CrossX-2, CrossY-2);\n"11037" context.lineTo(CrossX+2, CrossY+2);\n"11038" context.moveTo(CrossX+2, CrossY-2);\n"11039" context.lineTo(CrossX-2, CrossY+2);\n"11040" context.moveTo(CrossX, hstart);\n"11041" context.lineTo(CrossX, hstart + gh);\n"11042" context.stroke();\n"11043" TimerState.tooltipy = Math.min(YStart - BoxHeight, Y) + View.y;\n"11044" let Perc = 0;\n"11045" if(PERCENTILE_SAMPLES < PercentileCount)\n"11046" {\n"11047" let Idx = PercentileCount - PERCENTILE_SAMPLES + HighlightIndex;\n"11048" Perc = 100 * Idx / (PercentileCount-1);\n"11049" }\n"11050" else\n"11051" {\n"11052" let Idx = HighlightIndex - (PERCENTILE_SAMPLES - PercentileCount);\n"11053" Idx = Math.max(Idx, 0);\n"11054" Perc = 100 * (Idx / (PercentileCount-1))\n"11055" }\n"11056" TimerState.tooltipstring = FormatTime(Perc) + \'% \' + FormatTimeText(PercentileData[HighlightIndex], T);\n"11057" }\n"11058" hstart += gh;\n"11059" }\n"11060" }\n"11061" }\n"11062" ProfileLeave();\n"11063"}\n"11064"\n"11065"function DrawGraphViewLargeHeader(context, Text, Y, TextOffset)\n"11066"{\n"11067" context.textAlign = \"left\";\n"11068" context.fillStyle = \"grey\";\n"11069" context.strokeStyle = \"grey\";\n"11070" context.textBaseline = \"top\";\n"11071" context.font = FontLarger;\n"11072" context.beginPath();\n"11073" context.moveTo(0, Y);\n"11074" context.lineTo(nWidth, Y);\n"11075" context.stroke();\n"11076" context.fillText(Text, 0, Y + 2 + TextOffset);\n"11077" context.font = Font;\n"11078" context.textBaseline = \"alphabetic\";\n"11079" return Y + 2 + FontHeightLarger;\n"11080"}\n"11081"\n"11082"\n"11083"function CounterType(k)\n"11084"{\n"11085" let T = TimerArray[GetTimer(k)];\n"11086" let t0 = T.idtype;\n"11087" if(t0 == TYPE_TIMER)\n"11088" {\n"11089" if(T.timertype == MicroProfileTokenTypeGpu)\n"11090" {\n"11091" return 0;\n"11092" }\n"11093" else\n"11094" {\n"11095" return 1;\n"11096" }\n"11097" }\n"11098" else\n"11099" {\n"11100" if(T.format == FormatCounterBytes)\n"11101" {\n"11102" return 3;\n"11103" }\n"11104" else\n"11105" {\n"11106" return 2;\n"11107" }\n"11108" }\n"11109"}\n"11110"\n"11111"function CounterTypeName(n)\n"11112"{\n"11113" if(n == 0)\n"11114" return \"GPU\";\n"11115" if(n == 3)\n"11116" return \"Byte Counter\";\n"11117" if(n == 2)\n"11118" return \"Counter\";\n"11119"\n"11120" return \"CPU\";\n"11121"}\n"11122"\n"11123"function SortGraphs()\n"11124"{\n"11125" let TimerMap = FrameData.TimerMap;\n"11126" let Keys = [];\n"11127" for(let key in TimerMap)\n"11128" {\n"11129" let idx = GetTimer(key);\n"11130" let T = TimerArray[idx];\n"11131" if(!IsGroup(key) && T.e)\n"11132" {\n"11133" Keys.push(key);\n"11134" }\n"11135" }\n"11136" // sort based on idtype\n"11137" Keys.sort(function(l, r) {\n"11138" return CounterType(l)-CounterType(r);\n"11139" });\n"11140"\n"11141" return Keys;\n"11142"}\n"11143"\n"11144"function GetGraphTimeSource(TimerState)\n"11145"{\n"11146" if(Settings.GraphSoftMode)\n"11147" return TimerState.TimeSoft;\n"11148" else\n"11149" return TimerState.Time;\n"11150"}\n"11151"\n"11152"\n"11153"function DrawGraph(View, LocalMouseX, LocalMouseY, SubIndex, Split)\n"11154"{\n"11155" let TimerMap = FrameData.TimerMap;\n"11156" if(!TimerMap)\n"11157" return;\n"11158"\n"11159" ProfileEnter(\"DrawGraph\");\n"11160"\n"11161" let Canvas = View.Canvas[View.BackBuffer];\n"11162" let context = Canvas.getContext(\'2d\');\n"11163" context.clearRect(0, 0, View.w, View.h);\n"11164"\n"11165" let h = View.h;\n"11166" let w = View.w;\n"11167" let fHeightScale = h / ReferenceGraph;\n"11168" let MouseDragging = 0;\n"11169" let fWidth = w / (FRAME_COUNT-1);\n"11170" let HighlightFrame = -1;\n"11171" let GraphKey = null;\n"11172" let GraphBest = 0;\n"11173" let MouseTime = ReferenceGraph * (1-(LocalMouseY / h));\n"11174"\n"11175" \n"11176" let Keys = SortGraphs();\n"11177" let NumGraphs = Keys.length;\n"11178"\n"11179" if(LocalMouseX >= 0 && LocalMouseY >= 0 && LocalMouseX < w && LocalMouseY < h && SubMenuActive == -1)\n"11180" {\n"11181" var index = Math.floor(FRAME_COUNT * LocalMouseX / w);\n"11182" HighlightFrame = index;\n"11183" for(var key in TimerMap)\n"11184" {\n"11185" var idx = GetTimer(key);\n"11186" var T = TimerArray[idx];\n"11187" var TimerState = TimerMap[key];\n"11188" var Time = GetGraphTimeSource(TimerState);\n"11189" if(Time[index] >= MouseTime && (GraphBest == 0 || Time[index] <= GraphBest))\n"11190" {\n"11191" GraphKey = key;\n"11192" GraphBest = Time[index];\n"11193" }\n"11194" }\n"11195" ToolTipCallback = function(canvas, x, y)\n"11196" {\n"11197" if(Split)\n"11198" {\n"11199" let TimerMap = FrameData.TimerMap;\n"11200" let context = canvas.getContext(\'2d\');\n"11201" context.font = Font;\n"11202" let XPos = x - 20;\n"11203" for(let key in TimerMap)\n"11204" {\n"11205" let idx = GetTimer(key);\n"11206" let T = TimerArray[idx];\n"11207" if(T.e)\n"11208" {\n"11209" let TimerState = TimerMap[key];\n"11210" let Time = GetGraphTimeSource(TimerState);\n"11211" if(TimerState.tooltipysoft)\n"11212" {\n"11213" let RATE = 0.05;\n"11214" if(Math.abs(TimerState.tooltipysoft - TimerState.tooltipy) > 6)\n"11215" {\n"11216" TimerState.tooltipysoft = TimerState.tooltipy * RATE + TimerState.tooltipysoft * (1-RATE);\n"11217" }\n"11218" }\n"11219" else\n"11220" {\n"11221" TimerState.tooltipysoft = TimerState.tooltipy;\n"11222" }\n"11223" let Y = TimerState.tooltipysoft;\n"11224" let str = \'\' + FormatTimeText(Time[index], T);\n"11225" let w = context.measureText(str, XPos, Y).width;\n"11226" let X = Math.max(0, XPos - w);\n"11227" context.fillStyle = \'black\';\n"11228" context.fillRect(X - 1, Y-1 , w+2, BoxHeight+2);\n"11229" context.fillStyle = \'white\';\n"11230" context.textAlign = \'right\';\n"11231" context.fillText(str, X + w, Y+BoxHeight-2);\n"11232" }\n"11233"\n"11234" }\n"11235" context.textAlign = \'left\';\n"11236" }\n"11237" else\n"11238" {\n"11239" var StringArray = [];\n"11240" var ColorArray = [];\n"11241" var TimerMap = FrameData.TimerMap;\n"11242" for(var key in TimerMap)\n"11243" {\n"11244" if(!IsGroup(key))\n"11245" {\n"11246" var idx = GetTimer(key);\n"11247" var T = TimerArray[idx];\n"11248" var TimerState = TimerMap[key];\n"11249" var Time = GetGraphTimeSource(TimerState);\n"11250" ColorArray.push(TimerArray[idx].color);\n"11251" StringArray.push(\'\' + T.name);\n"11252" ColorArray.push(\'white\');\n"11253" StringArray.push(\'\' + FormatTime(Time[index]) + \'ms\') ;\n"11254" }\n"11255" }\n"11256" return {c:ColorArray,a:StringArray};\n"11257" }\n"11258" }\n"11259"\n"11260" }\n"11261"\n"11262" if(Split)\n"11263" {\n"11264" if(NumGraphs)\n"11265" {\n"11266"\n"11267" var hstart = 0;\n"11268" let gh = h / NumGraphs;\n"11269" let CurrentType = -1;\n"11270" let cidx = 1;\n"11271" for(let index in Keys)\n"11272" {\n"11273" let key = Keys[index];\n"11274" let idx = GetTimer(key);\n"11275" let T = TimerArray[idx];\n"11276" let TimerState = TimerMap[key];\n"11277" if(!IsGroup(key) && T.e)\n"11278" {\n"11279"\n"11280" let SubGraphSettings = GetSubGraphSettings(GetFullName(T));\n"11281" let Reference = GetSubGraphReferenceTime(T, SubGraphSettings, TimerState);\n"11282" let fHeightScale2 = gh / Reference;\n"11283"\n"11284" let Time = GetGraphTimeSource(TimerState);\n"11285" let color = TimerArray[idx].color;\n"11286" let X = w - Time.length*fWidth;\n"11287" let Y = hstart + gh;\n"11288" let YHeader = hstart;\n"11289" let YStart = Y;\n"11290" context.globalAlpha = 1;\n"11291" context.fillStyle = nBackColorsDark[cidx];\n"11292" cidx = 1-cidx;\n"11293" context.fillRect(0, hstart, w, gh);\n"11294"\n"11295" context.strokeStyle = color;\n"11296" context.fillStyle = color;\n"11297" context.beginPath();\n"11298" context.moveTo(X,Y);\n"11299" for(let i = 0; i < Time.length; ++i)\n"11300" {\n"11301" Y = Math.max(YStart - Time[i] * fHeightScale2, hstart);\n"11302" context.lineTo(X, Y);\n"11303" X += fWidth;\n"11304"\n"11305" }\n"11306" context.stroke();\n"11307" context.lineTo(X, YStart);\n"11308" context.globalAlpha = GRAPH_ALPHA;\n"11309" context.fill();\n"11310"\n"11311"\n"11312" context.globalAlpha = 1;\n"11313" context.fillStyle = \'wheat\';\n"11314" context.textAlign=\'right\';\n"11315" context.fillText(FormatTimeText(Reference, T), nWidth, hstart + FontHeight);\n"11316" {\n"11317" let Value = Time[Time.length-1];\n"11318" let YPos = Value * fHeightScale2 + Math.floor(0.5*FontHeight);\n"11319" const sp = FontHeight+2;\n"11320" YPos = Math.min(Math.max(sp, YPos), gh-2*sp);\n"11321" let Y = YStart - YPos;\n"11322" TimerState.finaly = Y;\n"11323" if(TimerState.finalysoft)\n"11324" {\n"11325" let RATE = 0.025;\n"11326" if(Math.abs(TimerState.finalysoft - TimerState.finaly) > 6)\n"11327" {\n"11328" TimerState.finalysoft = TimerState.finaly * RATE + TimerState.finalysoft * (1-RATE);\n"11329" }\n"11330" }\n"11331" else\n"11332" {\n"11333" TimerState.finalysoft = TimerState.finaly;\n"11334" }\n"11335" Y = TimerState.finalysoft;\n"11336" let str = \'\' + FormatTimeText(Value, T);\n"11337" let X = nWidth;\n"11338" let w = context.measureText(str, X, Y).width;\n"11339" context.fillStyle = \'black\';\n"11340" let a = context.globalAlpha;\n"11341" context.globalAlpha = 0.3;\n"11342" context.fillRect(X-w, Y-1-FontHeight , w+2, BoxHeight+2);\n"11343" context.globalAlpha = a;\n"11344" context.fillStyle = \'white\';\n"11345" context.fillText(FormatTimeText(Value, T), nWidth, TimerState.finalysoft);\n"11346" \n"11347"\n"11348" }\n"11349" context.textAlign=\'left\';\n"11350" context.fillText(FormatName(T), 15, hstart + FontHeight);\n"11351"\n"11352"\n"11353" let Type = CounterType(key);\n"11354" if(Type != CurrentType)\n"11355" { \n"11356" CurrentType = Type;\n"11357" DrawGraphViewLargeHeader(context, CounterTypeName(CurrentType), YHeader, FontHeight + 3);\n"11358" }\n"11359"\n"11360" if(HighlightFrame >= 0)\n"11361" {\n"11362" let X = w - Time.length * fWidth + fWidth * HighlightFrame;\n"11363" let Y = YStart - Math.min(Time[HighlightFrame], Reference) * fHeightScale2;\n"11364" context.strokeStyle = color;\n"11365" context.beginPath();\n"11366" let CrossX = X;\n"11367" let CrossY = Y;\n"11368" context.moveTo(CrossX-2, CrossY-2);\n"11369" context.lineTo(CrossX+2, CrossY+2);\n"11370" context.moveTo(CrossX+2, CrossY-2);\n"11371" context.lineTo(CrossX-2, CrossY+2);\n"11372" context.moveTo(CrossX, hstart);\n"11373" context.lineTo(CrossX, hstart + gh);\n"11374" context.stroke();\n"11375" TimerState.tooltipy = Math.min(YStart - BoxHeight, Y) + View.y;\n"11376" }\n"11377" hstart += gh;\n"11378" }\n"11379" }\n"11380" }\n"11381" }\n"11382" else\n"11383" {\n"11384" }\n"11385"\n"11386" ProfileLeave();\n"11387"}\n"11388"\n"11389"function StringHash(s) //note: matching code in microprofile.cpp: uint32_t MicroProfileStringHash(const char* pString)\n"11390"{\n"11391" var h = 0xfeedba3e;\n"11392" for(var i = 0; i < s.length; ++i)\n"11393" {\n"11394" h = s.charCodeAt(i) + ((h << 5) - h);\n"11395" h = h & h;\n"11396" }\n"11397" return Math.abs(h);\n"11398"}\n"11399"\n"11400"function StringColorIndex(Name)\n"11401"{\n"11402" var h = StringHash(Name);\n"11403" var cidx = Math.floor(360*(h / (1<<32-1)) );\n"11404" return cidx;\n"11405"}\n"11406"\n"11407"function ColorFromString(Name, S, L)\n"11408"{\n"11409" var H = StringColorIndex(Name);\n"11410" return \"hsl(\" + H + \",\" + S + \"%, \" + L+ \"%)\";\n"11411"}\n"11412"\n"11413"function LerpColor(v)\n"11414"{\n"11415" var R_0 = 0;\n"11416" var G_0 = 1;\n"11417" var B_0 = 0;\n"11418"\n"11419" var R_1 = 1;\n"11420" var G_1 = 0.5;\n"11421" var B_1 = 0;\n"11422"\n"11423" var R_2 = 1;\n"11424" var G_2 = 0;\n"11425" var B_3 = 0;\n"11426" var R;\n"11427" var G;\n"11428" if(v < 0.5)\n"11429" {\n"11430" v *= 2;\n"11431" var v0 = (1-v);\n"11432" R = R_0 * v0 + R_1 * v;\n"11433" G = G_0 * v0 + G_1 * v;\n"11434"\n"11435" }\n"11436" else\n"11437" {\n"11438" v = (v-0.5) * 2;\n"11439" var v0 = (1-v);\n"11440" R = R_1 * v0 + R_2 * v;\n"11441" G = G_1 * v0 + G_2 * v;\n"11442" }\n"11443" R *= 255;\n"11444" G *= 255;\n"11445" return \"rgb(\" + R.toFixed(0) + \",\" + G.toFixed(0) + \",0)\";\n"11446"\n"11447"}\n"11448"\n"11449"function DrawRange(context, X, XEnd, Y, YEnd, ColorBack, ColorFront)\n"11450"{\n"11451" if(X < XEnd)\n"11452" {\n"11453" var W = XEnd - X;\n"11454" var H = YEnd - Y;\n"11455" context.globalAlpha = 0.1;\n"11456" context.fillStyle = ColorBack;\n"11457" context.fillRect(X, Y, W, H);\n"11458" context.globalAlpha = 1;\n"11459" context.strokeStyle = ColorFront;\n"11460" context.beginPath();\n"11461" context.moveTo(X, 0);\n"11462" context.lineTo(X, H);\n"11463" context.moveTo(X+W, 0);\n"11464" context.lineTo(X+W, H);\n"11465" // context.closePath();\n"11466" context.stroke();\n"11467" }\n"11468"}\n"11469"\n"11470"\n"11471"function DrawHistory(View, LocalMouseX, LocalMouseY)\n"11472"{\n"11473" ProfileEnter(\"DrawHistory\");\n"11474" var Canvas = View.Canvas[View.BackBuffer];\n"11475" var context = Canvas.getContext(\'2d\');\n"11476" context.clearRect(0, 0, View.w, View.h);\n"11477" if(!FrameData.Time)\n"11478" return;\n"11479" var fHeight = View.h;\n"11480" var fWidth = nWidth / FRAME_COUNT;\n"11481" var fHeightScale = fHeight / ReferenceHistory;\n"11482" var fX = 0;\n"11483" var FrameIndex = -1;\n"11484" var MouseDragging = 0;\n"11485" var GreenTime = (Settings.TargetTime * 0.9);\n"11486" var RedBegin = (Settings.TargetTime * 1.1);\n"11487" var LerpDist = 1.0 / (RedBegin - GreenTime);\n"11488" var id0 = -1;\n"11489" var id1 = -1;\n"11490"\n"11491" if(MouseDragActiveXEnd > MouseDragActiveXStart)\n"11492" {\n"11493" var idx0 = Math.ceil(FRAME_COUNT * MouseDragActiveXStart / nWidth);\n"11494" var idx1 = Math.floor(FRAME_COUNT * MouseDragActiveXEnd / nWidth);\n"11495" idx0 = Clamp(idx0, 0, FRAME_COUNT-1);\n"11496" idx1 = Clamp(idx1, 0, FRAME_COUNT-1);\n"11497" id0 = FrameData.Ids[idx0];\n"11498" id1 = FrameData.Ids[idx1];\n"11499" }\n"11500"\n"11501"\n"11502" var ToolTipFrame = -1;\n"11503" for(var i = 0; i < FRAME_COUNT; i++)\n"11504" {\n"11505" var fMs = FrameData.Time[i];\n"11506" var fPrc = (fMs - GreenTime) * LerpDist;\n"11507" fPrc = Clamp(fPrc, 0, 1);\n"11508" var color = LerpColor(fPrc);\n"11509" var fid = FrameData.Ids[i];\n"11510" if(fid >= id0 && fid <= id1)\n"11511" {\n"11512" color = \'cyan\';\n"11513" }else if(FrameData.Frozen[i])\n"11514" {\n"11515" color = \'purple\';\n"11516" }\n"11517"\n"11518"\n"11519" var fH = fHeightScale * fMs;\n"11520" var bMouse = LocalMouseX > fX && LocalMouseX < fX + fWidth+1 && MouseY <= HistoryHeight;\n"11521" if(bMouse && !MouseDragging)\n"11522" {\n"11523" context.fillStyle = FRAME_HISTORY_COLOR_GPU;\n"11524" ToolTipFrame = i;\n"11525" }\n"11526" else\n"11527" {\n"11528" context.fillStyle = color;\n"11529" }\n"11530" context.fillRect(fX, fHeight - fH, fWidth-1, fH);\n"11531" fX += fWidth;\n"11532" }\n"11533"\n"11534"\n"11535" DrawRange(context, MouseDragActiveXStart, MouseDragActiveXEnd, 0, HistoryHeight, \'#59d0ff\', \'#00ddff\');\n"11536"\n"11537"\n"11538" var fH = fHeight - ";1153911540const size_t g_MicroProfileHtmlLive_begin_1_size = sizeof(g_MicroProfileHtmlLive_begin_1);11541const char g_MicroProfileHtmlLive_begin_2[] =11542"fHeightScale * Settings.TargetTime;\n"11543" context.fillStyle = \'wheat\';\n"11544" context.strokeStyle = \'wheat\';\n"11545" context.beginPath();\n"11546" context.moveTo(0, fH);\n"11547" context.lineTo(nWidth, fH);\n"11548" // context.closePath();\n"11549" context.stroke();\n"11550" var YText;\n"11551" if(fH > HistoryHeight * 0.25)\n"11552" {\n"11553" YText = fH - FontAscent;\n"11554" }\n"11555" else\n"11556" {\n"11557" YText = fH + FontHeight;\n"11558" }\n"11559"\n"11560" context.fillText(Settings.TargetTime + \'ms\', 3, YText);\n"11561" context.textAlign=\'right\';\n"11562" context.fillText(FormatTime(ReferenceHistory) + \'ms\', nWidth, FontHeight);\n"11563" context.textAlign=\'left\';\n"11564"\n"11565"\n"11566"\n"11567" if(ToolTipFrame >= 0)\n"11568" {\n"11569" var fMs = FrameData.Time[ToolTipFrame];\n"11570" var Frozen = FrameData.Frozen[ToolTipFrame];\n"11571" ToolTipCallback = function()\n"11572" {\n"11573" var StringArray = [];\n"11574" StringArray.push(\"Frame\");\n"11575" StringArray.push(\"\" + ToolTipFrame);\n"11576" StringArray.push(\"Time\");\n"11577" StringArray.push(\"\" + fMs.toFixed(3));\n"11578" if(Frozen)\n"11579" {\n"11580" StringArray.push(\"Frozen & Unreliable\");\n"11581" StringArray.push(\"\");\n"11582" }\n"11583" return StringArray;\n"11584" }\n"11585" }\n"11586"\n"11587"\n"11588" ProfileLeave();\n"11589"\n"11590"}\n"11591"function MouseInRect(Rect)\n"11592"{\n"11593" return MouseInside(Rect.x, Rect.y, Rect.w, Rect.h);\n"11594"}\n"11595"function MouseInside(X, Y, W, H)\n"11596"{\n"11597" return MouseX >= X && MouseX <= X + W && MouseY >= Y && MouseY <= Y + H;\n"11598"}\n"11599"\n"11600"var MessageText = \"\";\n"11601"var MessageTimeout = -1;\n"11602"var MessageTimeoutLast = new Date();\n"11603"var MessageShowSpinner = 0;\n"11604"function SetMessage(text, TimeOut, ShowSpinner)\n"11605"{\n"11606" if(TimeOut)\n"11607" {\n"11608" MessageTimeout = TimeOut;\n"11609" }\n"11610" else\n"11611" {\n"11612" MessageTimeout = -1;\n"11613" }\n"11614" MessageText = text;\n"11615" MessageShowSpinner = ShowSpinner;\n"11616"}\n"11617"function ClearMessage(Message)\n"11618"{\n"11619" if(Message == MessageText)\n"11620" {\n"11621" MessageText = \"\";\n"11622" MessageTimeout = -1;\n"11623" }\n"11624"}\n"11625"\n"11626"function DrawMessage()\n"11627"{\n"11628" var context = CanvasDetailedView.getContext(\'2d\');\n"11629" var Now = new Date();\n"11630" var Delta = Now - MessageTimeoutLast;\n"11631" if(MessageTimeout>0)\n"11632" {\n"11633" MessageTimeout -= Delta;\n"11634" if(MessageTimeout<= 0)\n"11635" {\n"11636" MessageText = \"\";\n"11637" MessageTimeout = -1;\n"11638" }\n"11639"\n"11640" }\n"11641" MessageTimeoutLast = Now;\n"11642"\n"11643" var Text = MessageText;\n"11644" var X = nWidth / 2;\n"11645"\n"11646" var Y = nHeight / 2;\n"11647" context.font = FontFlash;\n"11648" context.textAlign = \'center\';\n"11649" context.fillStyle = \'red\';\n"11650"\n"11651" function MSG(a, Spinner)\n"11652" {\n"11653" context.fillText(a, X, Y);\n"11654" if(Spinner)\n"11655" {\n"11656" var w = context.measureText(a).width;\n"11657" SpinnerDraw(1, context, SpinnerText0, X + 3 + w*0.5, Y - 25, 30, 30);\n"11658" SpinnerDraw(1, context, SpinnerText1, X - 3 - w*0.5 - 30, Y - 25, 30, 30);\n"11659" }\n"11660" Y -= 60;\n"11661" }\n"11662" if(!HelpFade)\n"11663" HelpFade = new Date();\n"11664" var HelpFadeTime = new Date() - HelpFade;\n"11665" if(HelpFadeTime < 2000)\n"11666" {\n"11667" var Alpha = 1 - (HelpFadeTime/2000);\n"11668" context.globalAlpha = Alpha;\n"11669" context.fillText(\"Press \'h\' for help\", X, 200);\n"11670" context.globalAlpha = 1;\n"11671" }\n"11672"\n"11673" if(Text != \"\")\n"11674" {\n"11675" MSG(Text);\n"11676" }\n"11677" if(IsFrozen)\n"11678" {\n"11679" MSG(\"FROZEN[space]\");\n"11680" }\n"11681" if(Settings.ViewCompressed && ViewCompressedTimeout > 0)\n"11682" {\n"11683" ViewCompressedTimeout -= Delta;\n"11684" MSG(\"Compressed: [CTRL-SPACE] To Exit\");\n"11685" }\n"11686"\n"11687" PresetPending++; //hack: wait 20 frames before showing enable messages to prevent it from showing when loading settings. [[[test]]]\n"11688" if(WSIsOpen && PresetPending > 20)\n"11689" {\n"11690" if(Settings.ViewActive != VIEW_COUNTERS)\n"11691" {\n"11692" if(GroupsEnabled == 0)\n"11693" {\n"11694" MSG(\"Paused: Enable groups in \'Control\' menu to unpause\");\n"11695" }\n"11696" if((CountersEnabled == 0 && TimersEnabled == 0) && Settings.ViewActive != VIEW_GRAPH_THREAD_GROUP)\n"11697" {\n"11698" MSG(\"Enable Timers or Counters\");\n"11699" }\n"11700" }\n"11701" }\n"11702" context.textAlign = \'left\';\n"11703" context.font = Font;\n"11704"}\n"11705"\n"11706"function DrawGraphSettingsMenu(context, XBase, Y, width, height)\n"11707"{\n"11708" if(SubMenuActive != SubMenuGraphSettings)\n"11709" {\n"11710" SubMenuGraphSettingsIndex = -1;\n"11711" SubMenuGraphSettingsKey = \"\";\n"11712" }\n"11713" if(!ShowMenu())\n"11714" {\n"11715" return;\n"11716" }\n"11717" if(!(Settings.ViewActive == VIEW_GRAPH_SPLIT || Settings.ViewActive == VIEW_GRAPH_PERCENTILE))\n"11718" {\n"11719" return;\n"11720" }\n"11721" \n"11722" let TimerMap = FrameData.TimerMap;\n"11723" let Keys = SortGraphs();\n"11724" let NumGraphs = Keys.length;\n"11725"\n"11726" let h = height;\n"11727" let w = width;\n"11728" let hstart = Y;\n"11729" let gh = h / NumGraphs;\n"11730" NumGraphs = 0;\n"11731" for(let index in Keys)\n"11732" {\n"11733" let key = Keys[index];\n"11734" {\n"11735" let idx = GetTimer(key);\n"11736" let T = TimerArray[idx];\n"11737" if(T.e)\n"11738" {\n"11739" let X = XBase+1;\n"11740" let Y = hstart+1;\n"11741" let MenuText = \">\";\n"11742" let w2 = 2 + context.measureText(MenuText).width;\n"11743" let bMouseInside = MouseInside(X, Y, w2, 4 + FontHeight);\n"11744" context.fillStyle = bMouseInside || (SubMenuGraphSettings == SubMenuActive && SubMenuGraphSettingsIndex == NumGraphs) ? nBackColors[1] : \'black\';\n"11745" context.fillRect(X, Y, w2, 4 + FontHeight);\n"11746" context.fillStyle = \'#ffffff\';\n"11747" context.fillText(MenuText, X, Y + FontHeight);\n"11748" context.textAlign = \'left\';\n"11749" if(bMouseInside)\n"11750" {\n"11751" SubMenuGraphSettingsIndex = NumGraphs;\n"11752" SubMenuGraphSettingsKey = GetFullName(T);\n"11753" CaptureButtonX = X + w2 + 2;\n"11754" CaptureButtonY = Y;\n"11755" EnableMenu(SubMenuGraphSettings);\n"11756" }\n"11757" NumGraphs++;\n"11758" hstart += gh;\n"11759"\n"11760"\n"11761" }\n"11762" }\n"11763" }\n"11764"}\n"11765"\n"11766"function DrawCaptureMenu(context)\n"11767"{\n"11768" MouseInCaptureButton = 0;\n"11769" if(!ShowMenu())\n"11770" {\n"11771" return;\n"11772" }\n"11773"\n"11774" var CaptureRange = MouseDragActiveXStart < MouseDragActiveXEnd ? \"Selection\" : (\"\"+Settings.CaptureFrames);\n"11775" var CaptureText = \"Capture[\" + CaptureRange + \"]\";\n"11776" var w = 10 + context.measureText(CaptureText).width;\n"11777" var X = nWidth / 2 - w / 2;\n"11778" var XCenter = nWidth / 2;\n"11779" var Y = nHeight - 30;\n"11780" MouseInCaptureButton = MouseInside(X, Y, w, 4 + FontHeight);\n"11781" context.textAlign = \'center\';\n"11782" context.fillStyle = MouseInCaptureButton ? nBackColors[1] : \'black\';\n"11783" context.fillRect(X, Y, w, 4 + FontHeight);\n"11784" context.fillStyle = \'#ffffff\';\n"11785" context.fillText(CaptureText, XCenter, Y + FontHeight);\n"11786"\n"11787"\n"11788"\n"11789" X += w + 2;\n"11790" var MenuText = \"^\";\n"11791" var w2 = 10 + context.measureText(MenuText).width;\n"11792" var bMouseInCaptureMenu = MouseInside(X, Y, w2, 4 + FontHeight);\n"11793" context.fillStyle = bMouseInCaptureMenu ? nBackColors[1] : \'black\';\n"11794" context.fillRect(X, Y, w2, 4 + FontHeight);\n"11795"\n"11796" context.fillStyle = \'#ffffff\';\n"11797" context.fillText(MenuText, X + w2*0.5, Y + FontHeight);\n"11798"\n"11799" let X1 = X + w2 + 10;\n"11800" if(CaptureTriggerDelta)\n"11801" {\n"11802" let text = FormatTime(CaptureTriggerDelta);\n"11803" let w = 10 + context.measureText(\"text\").width;\n"11804" context.fillStyle = \'black\';\n"11805" context.fillRect(X1, Y, w, 4 + FontHeight);\n"11806" context.fillStyle = \'#ffffff\';\n"11807" context.fillText(text, X1 + w*0.5, Y + FontHeight);\n"11808" X1 += w;\n"11809" }\n"11810"\n"11811" let Pending = (CaptureTriggerTime != null && CaptureTriggerTimeType == 2);\n"11812" if(AutoCaptureEnabled || Pending)\n"11813" {\n"11814" let d = Dots();\n"11815" let AutoStatus = Pending ? (\" pending\" + Dots()) : \"\";\n"11816" let Source = GetAutoCaptureString();\n"11817" let Threshold = FormatTime(Settings.AutoCaptureTheshold);\n"11818" let str = \"Autocapture \" + AutoStatus + \" Source:\'\" + Source + \"\' Threshold:\" + Threshold + \"ms Repeat=\" + (Pending?Settings.AutoCaptureRepeat:AutoCaptureEnabled);\n"11819" let w = 10 + context.measureText(str).width;\n"11820" context.fillStyle = \'black\';\n"11821" context.fillRect(X1, Y, w, 4 + FontHeight);\n"11822" context.fillStyle = \'#ffffff\';\n"11823" context.fillText(str, X1 + w*0.5, Y + FontHeight);\n"11824" X1 += w;\n"11825" }\n"11826"\n"11827" context.textAlign = \'left\';\n"11828" if(bMouseInCaptureMenu)\n"11829" {\n"11830" CaptureButtonX = X + w2;\n"11831" CaptureButtonY = Y;\n"11832" EnableMenu(SubMenuCapture);\n"11833" }\n"11834"}\n"11835"function UpdateX7Views()\n"11836"{\n"11837" if(Settings.ViewActive == VIEW_BAR_SINGLE || Settings.ViewActive == VIEW_BAR_ALL)\n"11838" {\n"11839" var NumSubViews = 0;\n"11840" var BarColumnEnabled = GetBarColumnEnabled();\n"11841" X7BarFirstView = -1;\n"11842" X7BarLastView = -1;\n"11843" var ViewMask = 0;\n"11844" for(var i = 0; i < BarColumnEnabled.length; ++i)\n"11845" {\n"11846" if(BarColumnEnabled[i])\n"11847" {\n"11848" if(X7BarFirstView == -1)\n"11849" X7BarFirstView = i;\n"11850" X7BarColumnRemap[NumSubViews++] = i;\n"11851" ViewMask = ViewMask | (1 << i);\n"11852" X7BarLastView = i;\n"11853" }\n"11854" }\n"11855" if(ViewMask != X7BarColumnMask)\n"11856" {\n"11857" console.log(\"resizing views\");\n"11858" var w = NumSubViews ? nWidth / NumSubViews : 1;\n"11859" for(var i = 0; i < X7Views.length; ++i)\n"11860" {\n"11861" X7Views[i].visible = i < NumSubViews;\n"11862" if(i < NumSubViews)\n"11863" {\n"11864" var HistoryH = Settings.ViewCompressed ? 0 : HistoryHeight;\n"11865" ResizeView(X7Views[i], w*i, HistoryH, w, nHeight - HistoryH);\n"11866" }\n"11867" }\n"11868" X7BarColumnMask = ViewMask;\n"11869" }\n"11870" X7LegendView.visible = true;\n"11871" ReferenceBarAutomatic = 0;\n"11872" }\n"11873"}\n"11874"function DrawViews()\n"11875"{\n"11876" Plotf(\"DrawViews\");\n"11877" UpdateX7Views();\n"11878" ProfileEnter(\"UpdateViews\");\n"11879" ViewIndex = 0;\n"11880" for(var i = 0; i < Views.length; ++i)\n"11881" {\n"11882" var View = Views[i];\n"11883" if(View.visible)\n"11884" {\n"11885" var LocalMouseX = MouseX - View.x;\n"11886" var LocalMouseY = MouseY - View.y;\n"11887" View.DisplayFunc(View, LocalMouseX, LocalMouseY, View.index);\n"11888" var Canvas = View.Canvas[View.BackBuffer];\n"11889" var Context = Canvas.getContext(\'2d\');\n"11890" ViewIndex++;\n"11891" }\n"11892" }\n"11893" ProfileLeave();\n"11894" var context = CanvasDetailedView.getContext(\'2d\');\n"11895" context.clearRect(0, 0, nWidth, nHeight);\n"11896" ProfileEnter(\"BlitViews\");\n"11897" for(var i = 0; i < Views.length; ++i)\n"11898" {\n"11899" var View = Views[i];\n"11900" if(View.visible)\n"11901" {\n"11902" context.drawImage(View.Canvas[View.BackBuffer], Math.floor(View.x), Math.floor(View.y), View.w, View.h);\n"11903" }\n"11904" }\n"11905"\n"11906" if(!Settings.ViewCompressed)\n"11907" {\n"11908" DrawCaptureMenu(context);\n"11909" DrawGraphSettingsMenu(context, MainView.x, MainView.y, MainView.w, MainView.h);\n"11910" }\n"11911"\n"11912" ProfileLeave();\n"11913"\n"11914"}\n"11915"const SubMenuGroup = 0;\n"11916"const SubMenuTimers = 1;\n"11917"const SubMenuCounters = 2;\n"11918"const SubMenuModules = 3;\n"11919"const SubMenuFunctions = 4;\n"11920"const SubMenuPatched = 5;\n"11921"const SubMenuSettings = 6;\n"11922"const SubMenuViews = 7;\n"11923"const SubMenuPresets = 8;\n"11924"const SubMenuColumns = 9;\n"11925"const SubMenuCapture = 10;\n"11926"const SubMenuGraphSettings = 11;\n"11927"let SubMenuGraphSettingsIndex = -1;\n"11928"let SubMenuGraphSettingsKey = \"\";\n"11929"\n"11930"let SubMenuActive = -1;\n"11931"let SubMenuTimeoutBase = 0.7;\n"11932"let SubMenuMouseX = 0;\n"11933"let SubMenuMouseY = 0;\n"11934"let SubMenuTimeout = new Date();\n"11935"let MenuItems = [];\n"11936"let FilterInputTimersValue = \'\';\n"11937"let FilterInputGroupsValue = \'\';\n"11938"let FilterInputCountersValue = \'\';\n"11939"let FilterInputModulesValue = \'\';\n"11940"let FilterInputFunctionsValue = \'\';\n"11941"let FilterInputPatchedValue = \'\';\n"11942"\n"11943"\n"11944"function MakeMenuItem(name, f, visible)\n"11945"{\n"11946" var Item = {};\n"11947" Item.name = name;\n"11948" Item.f = f;\n"11949" Item.w = name.length;\n"11950" Item.x = 0;\n"11951" Item.y = 0;\n"11952" Item.visible = visible;\n"11953" return Item;\n"11954"}\n"11955"function EnableMenu(m)\n"11956"{\n"11957" if(m != SubMenuActive)\n"11958" {\n"11959" if(SubMenuActive == SubMenuTimers)\n"11960" {\n"11961" FilterInputTimersValue = FilterInput.value;\n"11962" }\n"11963" else if(SubMenuActive == SubMenuGroup)\n"11964" {\n"11965" FilterInputGroupsValue = FilterInput.value;\n"11966" }\n"11967" else if(SubMenuActive == SubMenuCounters)\n"11968" {\n"11969" FilterInputCountersValue = FilterInput.value;\n"11970" }\n"11971" else if(SubMenuActive == SubMenuModules)\n"11972" {\n"11973" FilterInputModulesValue = FilterInput.value;\n"11974" }\n"11975" else if(SubMenuActive == SubMenuFunctions)\n"11976" {\n"11977" FilterInputFunctionsValue = FilterInput.value;\n"11978" }\n"11979" else if(SubMenuActive == SubMenuPatched)\n"11980" {\n"11981" FilterInputPatchedValue = FilterInput.value;\n"11982" }\n"11983"\n"11984" SubMenuActive = m;\n"11985" SubMenuTimeout = new Date();\n"11986"\n"11987" if(SubMenuActive == SubMenuTimers)\n"11988" {\n"11989" FilterInput.value = FilterInputTimersValue;\n"11990" }\n"11991" else if(SubMenuActive == SubMenuGroup)\n"11992" {\n"11993" FilterInput.value = FilterInputGroupsValue;\n"11994" }\n"11995" else if(SubMenuActive == SubMenuCounters)\n"11996" {\n"11997" FilterInput.value = FilterInputCountersValue;\n"11998" }\n"11999" else if(SubMenuActive == SubMenuModules)\n"12000" {\n"12001" FilterInput.value = FilterInputModulesValue;\n"12002" }\n"12003" else if(SubMenuActive == SubMenuFunctions)\n"12004" {\n"12005" FilterInput.value = FilterInputFunctionsValue;\n"12006" }\n"12007" else if(SubMenuActive == SubMenuPatched)\n"12008" {\n"12009" FilterInput.value = FilterInputPatchedValue;\n"12010" }\n"12011"\n"12012" FilterInputValueLast = FilterInput.value;\n"12013" }\n"12014" if(m == -1)\n"12015" {\n"12016" SubMenuTimeout = 0;\n"12017" }\n"12018"\n"12019" if(SubMenuActive == SubMenuTimers || SubMenuActive == SubMenuGroup || SubMenuActive == SubMenuCounters || SubMenuActive == SubMenuModules || SubMenuActive == SubMenuFunctions || SubMenuActive == SubMenuPatched)\n"12020" {\n"12021" FilterInputDiv.style[\'display\'] = \'inline\';\n"12022" FilterInput.focus();\n"12023" }\n"12024" else\n"12025" {\n"12026" FilterInputDiv.style[\'display\'] = \'none\';\n"12027" }\n"12028"}\n"12029"\n"12030"function Clamp(v, low, high)\n"12031"{\n"12032" return v < low ? low : (v > high ? high : v);\n"12033"}\n"12034"function TriggerCapture()\n"12035"{\n"12036" if(Settings.CaptureDelay <= 0)\n"12037" {\n"12038" Capture();\n"12039" }\n"12040" else\n"12041" {\n"12042" CaptureTriggerTime = new Date();\n"12043" CaptureTriggerTimeType = 1;\n"12044" }\n"12045"}\n"12046"function CaptureUpdate()\n"12047"{\n"12048" if(CaptureTriggerTime)\n"12049" {\n"12050" let Time = new Date();\n"12051" let Delta = Time - CaptureTriggerTime;\n"12052" CaptureTriggerDelta = Math.max(0.0, (Settings.CaptureDelay * 1000 - Delta) / 1000.0);\n"12053" if(Delta > Settings.CaptureDelay * 1000)\n"12054" {\n"12055" if(CaptureTriggerTimeType == 1)\n"12056" {\n"12057" Capture();\n"12058" }\n"12059" else if(CaptureTriggerTimeType == 2)\n"12060" {\n"12061" AutoCaptureEnabled = Settings.AutoCaptureRepeat > 0 ? Settings.AutoCaptureRepeat : 1;\n"12062" }\n"12063" CaptureTriggerTime = null;\n"12064" CaptureTriggerDelta = 0;\n"12065" CaptureTriggerTimeType = 0;\n"12066" }\n"12067" }\n"12068"\n"12069"}\n"12070"let OpenWindowIndex = 1;\n"12071"\n"12072"function OpenWindow(url)\n"12073"{\n"12074" if (window.matchMedia(\'(display-mode: browser)\').matches)\n"12075" {\n"12076" return window.open(url);\n"12077" }\n"12078" else\n"12079" {\n"12080"\n"12081" const width = window.outerWidth;\n"12082" const height = window.outerHeight;\n"12083"\n"12084" let left = window.screenX + 20 * (OpenWindowIndex%16+1);\n"12085" let top = window.screenY + 20 * (OpenWindowIndex%16+1);\n"12086"\n"12087" const features = `width=${width},height=${height},left=${left},top=${top}`;\n"12088" const name = \"new-window-\"+OpenWindowIndex;\n"12089" OpenWindowIndex += 1;\n"12090" return window.open(url, name, features);\n"12091" }\n"12092"}\n"12093"function Capture()\n"12094"{\n"12095" AutoCaptureCooldown = Settings.CaptureFrames + 5;\n"12096" var ext = \'\' + Settings.CaptureFrames;\n"12097" if(MouseDragActiveXEnd > MouseDragActiveXStart)\n"12098" {\n"12099" var idx0 = Math.ceil(FRAME_COUNT * MouseDragActiveXStart / nWidth);\n"12100" var idx1 = Math.floor(FRAME_COUNT * MouseDragActiveXEnd / nWidth);\n"12101" idx0 = Clamp(idx0, 0, FRAME_COUNT-1);\n"12102" idx1 = Clamp(idx1, 0, FRAME_COUNT-1);\n"12103" var id0 = FrameData.Ids[idx0];\n"12104" var id1 = FrameData.Ids[idx1];\n"12105" ext = \'r/\'+id0+\'/\'+id1;\n"12106" }\n"12107" let url = \'/\' + ext;\n"12108" OpenWindow(url);\n"12109"}\n"12110"function InitMenu()\n"12111"{\n"12112" MenuItems = [];\n"12113" MenuItems.push(MakeMenuItem(\"Control\", function(){EnableMenu(SubMenuGroup); } ));\n"12114" MenuItems.push(MakeMenuItem(\"Timers\", function(){EnableMenu(SubMenuTimers); } ));\n"12115" MenuItems.push(MakeMenuItem(\"Counters\", function(){EnableMenu(SubMenuCounters); } ));\n"12116" MenuItems.push(MakeMenuItem(\"Modules\", function(){EnableMenu(SubMenuModules); } ));\n"12117" MenuItems.push(MakeMenuItem(\"Functions\", function(){EnableMenu(SubMenuFunctions); } ));\n"12118" MenuItems.push(MakeMenuItem(\"Patched\", function(){EnableMenu(SubMenuPatched); }, function(){ return FunctionsInstrumented.length > 0;} ));\n"12119" MenuItems.push(MakeMenuItem(\"Settings\", function(){ EnableMenu(SubMenuSettings); } ));\n"12120" MenuItems.push(MakeMenuItem(\"Views\", function(){ EnableMenu(SubMenuViews); } ));\n"12121" MenuItems.push(MakeMenuItem(\"Presets\", function(){ EnableMenu(SubMenuPresets); } ));\n"12122" MenuItems.push(MakeMenuItem(\"Columns\", function(){ EnableMenu(SubMenuColumns); } ));\n"12123"}\n"12124"function DrawTopMenu()\n"12125"{\n"12126" var context = CanvasDetailedView.getContext(\'2d\');\n"12127" var X = 2;\n"12128" var Y = 0;\n"12129" var MouseInY = MouseY < BoxHeight;\n"12130" for(var i = 0; i < MenuItems.length; ++i)\n"12131" {\n"12132" if(i == SubMenuColumns)\n"12133" {\n"12134" if(Settings.ViewActive == VIEW_GRAPH_SPLIT ||\n"12135" Settings.ViewActive == VIEW_GRAPH_THREAD_GROUP ||\n"12136" Settings.ViewActive == VIEW_GRAPH_PERCENTILE ||\n"12137" Settings.ViewActive == VIEW_COUNTERS)\n"12138" {\n"12139" continue;\n"12140" }\n"12141" }\n"12142" var Item = MenuItems[i];\n"12143" if(Item.visible == null || Item.visible())\n"12144" {\n"12145" var w = context.measureText(Item.name).width + 4;\n"12146" var MouseIn = MouseInY && MouseX >= X && MouseX < X + w;\n"12147" var color = MouseIn ? nBackColors[1] : \"black\";\n"12148" Item.x = X;\n"12149" Item.y = Y + BoxHeight;\n"12150" if(MouseIn)\n"12151" {\n"12152" context.fillStyle = \'white\';\n"12153" context.fillRect(X-2, Y, w+4, BoxHeight);\n"12154" // Enable\n"12155" EnableMenu(i);\n"12156" }\n"12157" context.fillStyle = color;\n"12158" context.fillRect(X, Y, w, BoxHeight);\n"12159" context.fillStyle = \"white\";\n"12160" context.fillText(Item.name, X+2, Y+BoxHeight-FontAscent);\n"12161" if(MouseIn && MouseReleased)\n"12162" {\n"12163" Item.f();\n"12164" }\n"12165" X += w + 6;\n"12166" }\n"12167" }\n"12168"}\n"12169"\n"12170"function AggregateMenuSize()\n"12171"{\n"12172" var w = 250 + 5 + FontWidth;\n"12173" return WindowRect(nWidth / 2 - w / 2,HistoryHeight + 50, w, nHeight);\n"12174"}\n"12175"function TimerMenuSize()\n"12176"{\n"12177" return MenuSize(Math.max(WidthArray[TYPE_TIMER] + WidthArray[TYPE_GROUP], WidthArray[TYPE_COUNTER]) + 5 + FontWidth);\n"12178"}\n"12179"\n"12180"function GroupMenuSize()\n"12181"{\n"12182" return MenuSize(WidthTree);\n"12183"}\n"12184"function CounterMenuSize()\n"12185"{\n"12186" return MenuSize(CounterNameMenuWidth);\n"12187"}\n"12188"\n"12189"function MenuSize(w)\n"12190"{\n"12191" return WindowRect(nWidth / 2 - w / 2, HistoryHeight + 50,w, nHeight);\n"12192"}\n"12193"\n"12194"function CreateFilter(Filter)\n"12195"{\n"12196" if(!Filter || Filter.length == 0)\n"12197" {\n"12198" return null;\n"12199" }\n"12200" Filter = Filter.split(\' \');\n"12201"\n"12202" var regexp = \"\";\n"12203" for(var i = 0; i < Filter.length; ++i)\n"12204" {\n"12205" regexp = regexp + \".*\" + Filter[i];\n"12206" }\n"12207" Filter = new Array();\n"12208" regexp = regexp + \".*\";\n"12209" Filter.push(new RegExp(regexp, \"i\"));\n"12210" return Filter;\n"12211"}\n"12212"\n"12213"function FilterMatch(FilterArray, value)\n"12214"{\n"12215" if(!FilterArray)\n"12216" return true;\n"12217" for(var i = 0; i < FilterArray.length; ++i)\n"12218" {\n"12219" var res = value.search(FilterArray[i]);\n"12220" if(res<0)\n"12221" return false;\n"12222" }\n"12223" return true;\n"12224"}\n"12225"\n"12226"function AddPreset(Name)\n"12227"{\n"12228" var O = {};\n"12229" O[Name] = {};\n"12230" var OO = {};\n"12231" OO.p = O;\n"12232" OO.r = {};\n"12233" AddPresets(OO);\n"12234"}\n"12235"function JSONTryParse(str)\n"12236"{\n"12237" if(typeof str == \'string\')\n"12238" {\n"12239" try{\n"12240" return JSON.parse(str);\n"12241" }\n"12242" catch(e){}\n"12243" }\n"12244" return {};\n"12245"}\n"12246"\n"12247"function ProcessPresets(Data, Names, Cache)\n"12248"{\n"12249" for(var idx in Data)\n"12250" {\n"12251" if(Names.indexOf(idx) == -1)\n"12252" {\n"12253" Names.push(idx);\n"12254" }\n"12255" Cache[idx] = JSONTryParse(Data[idx]);\n"12256" Cache[idx].PresetName = idx;\n"12257" }\n"12258"}\n"12259"function AddPresets(Obj)\n"12260"{\n"12261" var Names = Obj.p;\n"12262" var ReadOnlyNames = Obj.r;\n"12263" ProcessPresets(Obj.p, Presets, PresetsCache);\n"12264" ProcessPresets(Obj.r, ReadOnlyPresets, ReadOnlyPresetsCache);\n"12265"}\n"12266"function GetFullName(T)\n"12267"{\n"12268" if(T.idtype == TYPE_COUNTER)\n"12269" {\n"12270" return T.countername;\n"12271" }\n"12272" else\n"12273" {\n"12274" let parent = T.parent;\n"12275" let ParentName = \"unknown\";\n"12276" let Name = T.name;\n"12277" if(parent && parent >= 0 && parent < TimerArray.length)\n"12278" {\n"12279" ParentName = TimerArray[parent].name;\n"12280" }\n"12281" return ParentName + \"/\" + Name;\n"12282" }\n"12283"}\n"12284"\n"12285"function ColorFromFullName(name, type)\n"12286"{\n"12287" for(var i = 0; i < TimerArray.length; ++i)\n"12288" {\n"12289" var t = TimerArray[i];\n"12290" if(t.idtype == type && GetFullName(t) == name)\n"12291" {\n"12292" return t.color;\n"12293" }\n"12294" }\n"12295" return \'white\';\n"12296"\n"12297"}\n"12298"function EnableByName(name, type)\n"12299"{\n"12300" for(var i = 0; i < TimerArray.length; ++i)\n"12301" {\n"12302" var t = TimerArray[i];\n"12303" if(t.idtype == type && GetFullName(t) == name)\n"12304" {\n"12305" WSSendMessage(\"c\" + t.id);\n"12306" }\n"12307" }\n"12308"}\n"12309"\n"12310"\n"12311"function OnLoadPreset(NewSettings, Apply, RO, Name)\n"12312"{\n"12313" if(Apply)\n"12314" {\n"12315" WSSendMessage(\"d\");\n"12316" PresetPending = 0;\n"12317" }\n"12318" ActivePreset = Name ? Name : NewSettings.PresetName;\n"12319" ActivePresetRO = RO ? 1 : 0;\n"12320" console.log(\'loading preset \' + ActivePresetRO);\n"12321" var EnableCount = 0;\n"12322" for(var idx in NewSettings)\n"12323" {\n"12324" if(idx == \'Timers\')\n"12325" {\n"12326" if(Apply)\n"12327" {\n"12328" var Timers = NewSettings[idx];\n"12329" for(var i = 0; i < Timers.length; ++i)\n"12330" {\n"12331" var FullName = Timers[i];\n"12332" EnableCount++;\n"12333" EnableByName(FullName, TYPE_TIMER);\n"12334" }\n"12335" }\n"12336" }\n"12337" else if(idx == \'Groups\')\n"12338" {\n"12339" if(Apply)\n"12340" {\n"12341" var Groups = NewSettings[idx];\n"12342" for(var i = 0; i < Groups.length; ++i)\n"12343" {\n"12344" var FullName = Groups[i];\n"12345" EnableByName(FullName, TYPE_GROUP);\n"12346" }\n"12347" }\n"12348" }\n"12349" else if(idx == \'Counters\')\n"12350" {\n"12351" if(Apply)\n"12352" {\n"12353" var Counters = NewSettings[idx];\n"12354" for(var i = 0; i < Counters.length; ++i)\n"12355" {\n"12356" var FullName = Counters[i];\n"12357" EnableByName(FullName, TYPE_COUNTER);\n"12358" }\n"12359" }\n"12360" }\n"12361" else\n"12362" {\n"12363" Settings[idx] = NewSettings[idx];\n"12364" }\n"12365" }\n"12366"\n"12367" if(Settings.FunctionsInstrumented && Apply)\n"12368" {\n"12369" if(Settings.FunctionsInstrumented.length == Settings.FunctionsInstrumentedModule.length && Settings.FunctionsInstrumented.length == Settings.FunctionsInstrumentedUnmangled.length)\n"12370" {\n"12371" var Msg = \"D\" + Settings.FunctionsInstrumented.length + \" \";\n"12372" for(var i = 0; i < Settings.FunctionsInstrumented.length; ++i)\n"12373" {\n"12374" Msg += Settings.FunctionsInstrumentedModule[i] + \"!\" + Settings.FunctionsInstrumentedUnmangled[i] + \"!\";\n"12375" }\n"12376" WSSendMessage(Msg);\n"12377" }\n"12378" }\n"12379" if(Settings.ViewActive >= 0)\n"12380" {\n"12381" ResizeCanvas();\n"12382" }\n"12383"}\n"12384"function SanitizeString(s)\n"12385"{\n"12386" let r = \"\";\n"12387" for(let i = 0; i < s.length; ++i)\n"12388" {\n"12389" let c = s[i];\n"12390" if(!((c>=\'a\' && c<=\'z\') || (c >=\'A\' && c <= \'Z\') || (c >= \'0\' && c <= \'9\')))\n"12391" {\n"12392" r += \'_\';\n"12393" }\n"12394" else\n"12395" {\n"12396" r += c;\n"12397" }\n"12398" }\n"12399" return r;\n"12400"}\n"12401"function LoadPreset(Name, RO)\n"12402"{\n"12403" Name = SanitizeString(Name);\n"12404" WSSendMessage((RO?\"m\":\"l\")+Name);\n"12405"}\n"12406"\n"12407"function SavePreset(Name)\n"12408"{\n"12409" Name = SanitizeString(Name);\n"12410" AddPreset(Name);\n"12411" let Timers = [];\n"12412" let Groups = [];\n"12413" let Counters = [];\n"12414" for(var i = 0; i < TimerArray.length; ++i)\n"12415" {\n"12416" let t = TimerArray[i];\n"12417" let idtype = TimerArray[i].idtype;\n"12418" if(t.e)\n"12419" {\n"12420" if(idtype == TYPE_TIMER)\n"12421" {\n"12422" Timers.push(GetFullName(t));\n"12423" }\n"12424" else if(idtype == TYPE_GROUP)\n"12425" {\n"12426" Groups.push(GetFullName(t));\n"12427" }\n"12428" else if(idtype == TYPE_COUNTER)\n"12429" {\n"12430" Counters.push(t.countername);\n"12431" }\n"12432" }\n"12433" }\n"12434"\n"12435" Settings.Timers = Timers;\n"12436" Settings.Groups = Groups;\n"12437" Settings.Counters = Counters;\n"12438" Settings.PresetName = Name;\n"12439" let Clone = function(A)\n"12440" {\n"12441" let N = Array(A.length);\n"12442" for(var i = 0; i < A.length; ++i)\n"12443" {\n"12444" N[i] = A[i];\n"12445" }\n"12446" return N;\n"12447" };\n"12448" Settings.FunctionsInstrumented = Clone(FunctionsInstrumented);\n"12449" Settings.FunctionsInstrumentedModule = Clone(FunctionsInstrumentedModule);\n"12450" Settings.FunctionsInstrumentedUnmangled = Clone(FunctionsInstrumentedUnmangled);\n"12451"\n"12452" var JsonSettings = JSON.stringify(Settings);\n"12453" console.log(\'settings stored \' + JsonSettings);\n"12454" WSSendMessage(\"s\"+Name+\",\"+JsonSettings);\n"12455" ActivePreset = Name;\n"12456" ActivePresetRO = 0;\n"12457"}\n"12458"function DrawMenuPresets()\n"12459"{\n"12460" var Selection = null;\n"12461" var SizeInfo = {};\n"12462" SizeInfo.h = BoxHeight * (Presets.length * 2);\n"12463" if(ReadOnlyPresets.length)\n"12464" {\n"12465" SizeInfo.h += BoxHeight * (Presets.length + 1);\n"12466" }\n"12467" var x = MenuItems[SubMenuPresets].x;\n"12468" var y = MenuItems[SubMenuPresets].y;\n"12469"\n"12470" var Width = 50;\n"12471" var WLeft = MeasureArray(0, [\"Save \", \"Load \", \"Save As ..\", \"Builtin\" ]);\n"12472" Width = MeasureArray(Width, Presets);\n"12473" var Width = 35 + Width + WLeft;\n"12474" SizeInfo.w = Width;\n"12475" SizeInfo.x = x;\n"12476" SizeInfo.y = y;\n"12477"\n"12478" var M = CreateMenuState(SizeInfo);\n"12479" var context = CanvasDetailedView.getContext(\'2d\');\n"12480"\n"12481" var SettingsCached;\n"12482" var SettingsCachedY = 0;\n"12483"\n"12484" for(var i = 0; i < Presets.length; ++i)\n"12485" {\n"12486" var Active = (ActivePresetRO == 0 && ActivePreset == Presets[i]) ? 1 : 0;\n"12487" if(DrawMenuElementMouseIn(M))\n"12488" {\n"12489" SettingsCachedY = M.y;\n"12490" SettingsCached = PresetsCache[Presets[i]];\n"12491" }\n"12492"\n"12493" if(DrawMenuElement(M, Active, \"Load\", Presets[i], \'white\', 0))\n"12494" {\n"12495" LoadPreset(Presets[i]);\n"12496" }\n"12497" }\n"12498" DrawMenuElement(M, 0, \"---\", \"\", \'white\', 0);\n"12499" if(DrawMenuElement(M, 0, \"Save As..\", \"\", \'white\', 0))\n"12500" {\n"12501" var str = ShowPrompt(\'Enter Preset Name\', \'\');\n"12502" if(str.length>1)\n"12503" {\n"12504" SavePreset(str);\n"12505" }\n"12506"\n"12507" }\n"12508"\n"12509" for(var i = 0; i < Presets.length; ++i)\n"12510" {\n"12511" var Active = (ActivePresetRO == 0 && ActivePreset == Presets[i]) ? 1 : 0;\n"12512" if(DrawMenuElement(M, Active, \"Save\", Presets[i], \'white\', 0))\n"12513" {\n"12514" SavePreset(Presets[i]);\n"12515" }\n"12516" }\n"12517" if(ReadOnlyPresets && ReadOnlyPresets.length > 0)\n"12518" {\n"12519" DrawMenuElement(M, 0, \"---\", \"\", \'white\', 0);\n"12520" for(var i = 0; i < ReadOnlyPresets.length; ++i)\n"12521" {\n"12522" var Active = (ActivePresetRO && ActivePreset == ReadOnlyPresets[i]) ? 1 : 0;\n"12523" if(DrawMenuElementMouseIn(M))\n"12524" {\n"12525" SettingsCachedY = M.y;\n"12526" SettingsCached = ReadOnlyPresetsCache[ReadOnlyPresets[i]];\n"12527" }\n"12528" if(DrawMenuElement(M, Active, \"Builtin\", ReadOnlyPresets[i], \'white\', 0))\n"12529" {\n"12530" LoadPreset(ReadOnlyPresets[i], 1);\n"12531" }\n"12532" }\n"12533" }\n"12534" SizeInfo.h = M.y - SizeInfo.y;\n"12535"\n"12536"\n"12537" if(SettingsCached)\n"12538" {\n"12539" let SizeLeft = 10 * FontWidth;\n"12540" let Timers = SettingsCached.Timers;\n"12541" let Groups = SettingsCached.Groups;\n"12542" let Counters = SettingsCached.Counters;\n"12543" let Patched = SettingsCached.Patched;\n"12544" let W = 0;\n"12545" let H = 0;\n"12546" if(Timers)\n"12547" {\n"12548" W = MeasureArray(W, Timers);\n"12549" H = 1 + Timers.length;\n"12550" }\n"12551" if(Groups)\n"12552" {\n"12553" W = MeasureArray(W, Groups);\n"12554" H = 1 + Groups.length;\n"12555" }\n"12556" if(Counters)\n"12557" {\n"12558" W = MeasureArray(W, Counters);\n"12559" H = 1 + Counters.length;\n"12560" }\n"12561" if(Patched)\n"12562" {\n"12563" W = MeasureArray(W, Patched);\n"12564" H = 1 + Patched.length;\n"12565" }\n"12566" W += 40;\n"12567" H = H * (FontHeight+1);\n"12568" let M = CreateMenuState(SizeInfo);\n"12569" M.x += M.w + 5;\n"12570" M.y = SettingsCachedY;\n"12571" M.w = W;\n"12572" M.h = H;\n"12573"\n"12574" if(Groups && Groups.length)\n"12575" {\n"12576" DrawMenuElement(M, 0, \"Groups\", \"\", \'white\', 0);\n"12577" for(let i = 0; i < Groups.length; ++i)\n"12578" {\n"12579" DrawMenuElement(M, 0, \"\", Groups[i], \'white\', 0);\n"12580" }\n"12581" }\n"12582" if(Timers && Timers.length)\n"12583" {\n"12584" DrawMenuElement(M, 0, \"Timers\", \"\", \'white\', 0);\n"12585" for(let i = 0; i < Timers.length; ++i)\n"12586" {\n"12587" DrawMenuElement(M, 0, \"\", Timers[i], ColorFromFullName(Timers[i], TYPE_TIMER), 0);\n"12588" }\n"12589" }\n"12590" if(Counters && Counters.length)\n"12591" {\n"12592" DrawMenuElement(M, 0, \"Counters\", \"\", \'white\', 0);\n"12593" for(let i = 0; i < Counters.length; ++i)\n"12594" {\n"12595" DrawMenuElement(M, 0, \"\", Counters[i], ColorFromFullName(Counters[i], TYPE_COUNTER), 0);\n"12596" }\n"12597" }\n"12598"\n"12599"\n"12600" if(Patched && Patched.length)\n"12601" {\n"12602" DrawMenuElement(M, 0, \"Patched\", \"\", \'white\', 0);\n"12603" for(let i = 0; i < Patched.length; ++i)\n"12604" {\n"12605" DrawMenuElement(M, 0, \"\", Patched[i], \'white\', 0);\n"12606" }\n"12607" }\n"12608"\n"12609"\n"12610" }\n"12611"\n"12612" return SizeInfo;\n"12613"}\n"12614"\n"12615"function DrawMenuColumns()\n"12616"{\n"12617" var Selection = null;\n"12618" var SizeInfo = {};\n"12619" var BarColumnNames = GetBarColumnNames();\n"12620" var BarColumnEnabled = GetBarColumnEnabled();\n"12621" SizeInfo.h = BoxHeight * (BarColumnNames.length);\n"12622" var x = MenuItems[SubMenuColumns].x;\n"12623" var y = MenuItems[SubMenuColumns].y;\n"12624"\n"12625" var Width = MeasureArray(0, BarColumnNames);\n"12626" SizeInfo.w = Width;\n"12627" SizeInfo.x = x;\n"12628" SizeInfo.y = y;\n"12629"\n"12630" var M = CreateMenuState(SizeInfo);\n"12631" var context = CanvasDetailedView.getContext(\'2d\');\n"12632" context.fillRect(M.x, M.y, Width, SizeInfo.h);\n"12633"\n"12634"\n"12635" for(var i = 0; i < BarColumnNames.length; ++i)\n"12636" {\n"12637" var Active = ActivePreset == Presets[i] ? 1 : 0;\n"12638" if(DrawMenuElement(M, BarColumnEnabled[i], BarColumnNames[i], \"\", \'white\', 0))\n"12639" {\n"12640" BarColumnEnabled[i] = !BarColumnEnabled[i];\n"12641" for(var j = 0; j < ColumnsWidth.length; ++j)\n"12642" {\n"12643" ColumnsWidth[i] = 20;\n"12644" }\n"12645" }\n"12646" }\n"12647"\n"12648" SizeInfo.h = M.y - SizeInfo.y;\n"12649" return SizeInfo;\n"12650"\n"12651"}\n"12652"\n"12653"\n"12654"function ToggleView()\n"12655"{\n"12656" Settings.ViewActive = (Settings.ViewActive+1) % VIEW_SIZE;\n"12657" ActivateView(Settings.ViewActive);\n"12658"}\n"12659"\n"12660"function ActivateView(idx)\n"12661"{\n"12662" for(var i = 1; i < Views.length; ++i)\n"12663" {\n"12664" Views[i].visible = false;\n"12665" }\n"12666" if(idx == VIEW_GRAPH_SPLIT)\n"12667" {\n"12668" MainView.DisplayFunc = DrawGraphSplit;\n"12669" MainView.visible = true;\n"12670" }\n"12671" else if(idx == VIEW_GRAPH_PERCENTILE)\n"12672" {\n"12673" MainView.DisplayFunc = DrawGraphPercentile;\n"12674" MainView.visible = true;\n"12675" }\n"12676" else if(idx == VIEW_GRAPH_THREAD_GROUP)\n"12677" {\n"12678" MainView.DisplayFunc = DrawGraphThreadGroup;\n"12679" MainView.visible = true;\n"12680" }\n"12681" else if(idx == VIEW_BAR)\n"12682" {\n"12683" MainView.DisplayFunc = DrawTableView;\n"12684" MainView.visible = true;\n"12685" }\n"12686" else if(idx == VIEW_COUNTERS)\n"12687" {\n"12688" MainView.DisplayFunc = DrawCounterView;\n"12689" MainView.visible = true;\n"12690" }\n"12691" else if(idx == VIEW_BAR_SINGLE || idx == VIEW_BAR_ALL)\n"12692" {\n"12693" for(var i = 0; i < X7Views.length; ++i)\n"12694" {\n"12695" X7Views[i].visible = true;\n"12696" }\n"12697" SingleTimerBars = idx == VIEW_BAR_SINGLE;\n"12698" }\n"12699" Settings.ViewActive = idx;\n"12700" X7BarColumnMask = -1;\n"12701" ViewBarMaxMsTextLength = 0;\n"12702"}\n"12703"function DrawMenuViews()\n"12704"{\n"12705" let ViewClick = function(idx, name)\n"12706" {\n"12707" ActivateView(idx);\n"12708" };\n"12709" let x = MenuItems[SubMenuViews].x;\n"12710" let y = MenuItems[SubMenuViews].y;\n"12711" return DrawMenuGeneric(ViewNames, Settings.ViewActive, ViewClick, x, y, ViewNames2);\n"12712"}\n"12713"\n"12714"function TweakValue(Value, Tweak, amount, Min, Max)\n"12715"{\n"12716" let V = 0.98;\n"12717" const FloatStepLimitBase10 = 1;\n"12718" if(Value <= Math.pow(10, FloatStepLimitBase10) + 0.001)\n"12719" {\n"12720" let StepBase10 = FloatStepLimitBase10;\n"12721" let ScaleToInt = 10;\n"12722" while(Value < Math.pow(10, StepBase10))\n"12723" {\n"12724" StepBase10 -= 1;\n"12725" ScaleToInt *= 10;\n"12726" }\n"12727" let Step = Math.pow(10, StepBase10) / 10.0;\n"12728" Value += Tweak * Step;\n"12729" Value = Math.floor(Value*ScaleToInt) / ScaleToInt;\n"12730" }\n"12731" else\n"12732" {\n"12733" if(Tweak<0)\n"12734" {\n"12735" for(var x = 0; x < Math.abs(Tweak); ++x)\n"12736" {\n"12737" var newValue = Math.floor(Value*V);\n"12738" if(newValue == Value)\n"12739" {\n"12740" Value--;\n"12741" }\n"12742" else\n"12743" {\n"12744" Value = newValue;\n"12745" }\n"12746" }\n"12747" }\n"12748" else\n"12749" {\n"12750" var RcpV = 1.0 / V;\n"12751"\n"12752" for(var x = 0; x < Tweak; ++x)\n"12753" {\n"12754" var newValue = Math.ceil(Value*RcpV);\n"12755" if(newValue == Value)\n"12756" {\n"12757" Value++;\n"12758" }\n"12759" else\n"12760" {\n"12761" Value = newValue;\n"12762" }\n"12763" }\n"12764" }\n"12765" }\n"12766" if(Min!=null && Value < Min)\n"12767" Value = Min;\n"12768" if(Max!=null && Value > Max)\n"12769" Value = Max;\n"12770" return Value;\n"12771"\n"12772"}\n"12773"\n"12774"function NextValue(Presets, Value, Dir)\n"12775"{\n"12776" var idx = 0;\n"12777" if(Dir > 0)\n"12778" {\n"12779" for(idx = 0;idx < Presets.length; ++idx)\n"12780" {\n"12781" if(Presets[idx] > Value)\n"12782" {\n"12783" break;\n"12784" }\n"12785" }\n"12786" }\n"12787" else\n"12788" {\n"12789" for(idx = Presets.length; idx >= 0; idx -= 1)\n"12790" {\n"12791" if(Presets[idx] < Value)\n"12792" {\n"12793" break;\n"12794" }\n"12795" }\n"12796" }\n"12797" idx = (idx + Presets.length) % Presets.length;\n"12798" return Presets[idx];\n"12799"}\n"12800"function AutoCaptureRoll(Direction, Tweak, SetDirect)\n"12801"{\n"12802" if(SetDirect)\n"12803" {\n"12804" Settings.AutoCaptureTheshold = SetDirect;\n"12805" }\n"12806" else if(Tweak)\n"12807" {\n"12808" Settings.AutoCaptureTheshold = TweakValue(Settings.AutoCaptureTheshold, Tweak, 0.98, 1, 500);\n"12809" }\n"12810" else if(Direction)\n"12811" {\n"12812" Settings.AutoCaptureTheshold = NextValue(AutoCaptureThesholdPresets, Settings.AutoCaptureTheshold, Direction);\n"12813" }\n"12814"}\n"12815"function AutoCaptureRepeatRoll(Direction, Tweak, SetDirect)\n"12816"{\n"12817" if(SetDirect)\n"12818" {\n"12819" Settings.AutoCaptureRepeat = SetDirect;\n"12820" }\n"12821" else if(Tweak)\n"12822" {\n"12823" Settings.AutoCaptureRepeat = TweakValue(Settings.AutoCaptureRepeat, Tweak, 0.98, 1, 500);\n"12824" }\n"12825" else if(Direction)\n"12826" {\n"12827" Settings.AutoCaptureRepeat = NextValue(AutoCaptureRepeatPresets, Settings.AutoCaptureRepeat, Direction);\n"12828" }\n"12829"}\n"12830"function CaptureRoll(Direction, Tweak, SetDirect)\n"12831"{\n"12832" if(SetDirect)\n"12833" {\n"12834" Settings.CaptureFrames = SetDirect;\n"12835" }\n"12836" else if(Tweak)\n"12837" {\n"12838" Settings.CaptureFrames = TweakValue(Settings.CaptureFrames, Tweak, 0.98, 5, 300);\n"12839"\n"12840" }\n"12841" else if(Direction)\n"12842" {\n"12843" Settings.CaptureFrames = NextValue(CaptureFramesPresets, Settings.CaptureFrames, Direction);\n"12844" }\n"12845"}\n"12846"function CaptureDelayRoll(Direction, Tweak, SetDirect)\n"12847"{\n"12848" if(SetDirect)\n"12849" {\n"12850" Settings.CaptureDelay = SetDirect;\n"12851" }\n"12852" else if(Tweak)\n"12853" {\n"12854" Settings.CaptureDelay = TweakValue(Settings.CaptureDelay, Tweak, 0.98, 5, 300);\n"12855"\n"12856" }\n"12857" else if(Direction)\n"12858" {\n"12859" Settings.CaptureDelay = NextValue(CaptureDelayPresets, Settings.CaptureDelay, Direction);\n"12860" }\n"12861"}\n"12862"\n"12863"function GetAutoCaptureString()\n"12864"{\n"12865" if(AutoCaptureSourceIndex >= 0)\n"12866" {\n"12867" if(AutoCaptureSourceIndex >= EnabledArray.length)\n"12868" {\n"12869" AutoCaptureSourceIndex = -1;\n"12870" AutoCaptureSourceIndex = -1;\n"12871" }\n"12872" else\n"12873" {\n"12874" var idx = EnabledArray[AutoCaptureSourceIndex];\n"12875" return TimerArray[idx].name;\n"12876" }\n"12877" }\n"12878" return \"Frame Time\";\n"12879"}\n"12880"\n"12881"function AutoCaptureSourceRoll(Direction, Tweak, SetDirect)\n"12882"{\n"12883" if(SetDirect)\n"12884" {\n"12885"\n"12886" }else if(Tweak||Direction)\n"12887" {\n"12888" if(!Direction)\n"12889" Direction = Tweak;\n"12890" if(Direction<0)\n"12891" {\n"12892" AutoCaptureSourceIndex--;\n"12893" if(AutoCaptureSourceIndex<-1)\n"12894" {\n"12895" AutoCaptureSourceIndex = EnabledArray.length-1;\n"12896" }\n"12897" }\n"12898" else\n"12899" {\n"12900" AutoCaptureSourceIndex++;\n"12901" if(AutoCaptureSourceIndex >= EnabledArray.length)\n"12902" {\n"12903" AutoCaptureSourceIndex = -1;\n"12904" }\n"12905" }\n"12906"\n"12907" }\n"12908"}\n"12909"function IsPromptActive()\n"12910"{\n"12911" let Delta = (new Date()) - PromptExitTime;\n"12912" let Result = PromptActive || Delta < 200;\n"12913" return Result;\n"12914"}\n"12915"function EnterPrompt()\n"12916"{\n"12917" PromptActive = 1;\n"12918"}\n"12919"function ExitPrompt()\n"12920"{\n"12921" PromptActive = 0;\n"12922" PromptExitTime = new Date();\n"12923"}\n"12924"\n"12925"function ShowPrompt(Title, Value, Type)\n"12926"{\n"12927" PromptActive = 1;\n"12928" EnterPrompt();\n"12929" let v;\n"12930" if(Type == \'int\')\n"12931" {\n"12932" let newValue = prompt(\'\' + Title, \'\' + Value);\n"12933" v = parseInt(newValue);\n"12934" }\n"12935" else if(Type == \'float\')\n"12936" {\n"12937" let newValue = prompt(\'\' + Title, \'\' + Value);\n"12938" v = parseFloat(newValue);\n"12939" }\n"12940" else\n"12941" {\n"12942" let v = prompt(\'\' + Title, \'\' + Value);\n"12943" ExitPrompt();\n"12944" return v;\n"12945" }\n"12946" ExitPrompt();\n"12947" if(isNaN(v))\n"12948" {\n"12949" return Value;\n"12950" }\n"12951" else\n"12952" {\n"12953" return v;\n"12954" }\n"12955"\n"12956"}\n"12957"function MeasureArray(v, A, f)\n"12958"{\n"12959" var context = CanvasDetailedView.getContext(\'2d\');\n"12960" for(var i = 0; i < A.length; ++i)\n"12961" {\n"12962" var s = A[i];\n"12963" if(f)\n"12964" s=f(s, i);\n"12965" var l = context.measureText(s).width;\n"12966" v = v < l ? l : v;\n"12967" }\n"12968" return v;\n"12969"}\n"12970"\n"12971"function CreateMenuState(SizeInfo)\n"12972"{\n"12973" var MenuState = {};\n"12974" for(var i in SizeInfo)\n"12975" {\n"12976" MenuState[i] = SizeInfo[i];\n"12977" }\n"12978" MenuState.cidx = 0;\n"12979" return MenuState;\n"12980"}\n"12981"function DrawMenuElementMouseIn(M)\n"12982"{\n"12983" return MouseY >= M.y && MouseY < M.y + BoxHeight;\n"12984"}\n"12985"function DrawMenuElement(M, Selected, Name, Value, color)\n"12986"{\n"12987" var context = CanvasDetailedView.getContext(\'2d\');\n"12988"\n"12989" var bMouseIn = DrawMenuElementMouseIn(M);\n"12990" var YText = M.y + BoxHeight - FontAscent;\n"12991"\n"12992" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[M.cidx];\n"12993" context.fillStyle = Selected?\'white\':bgcolor;\n"12994" context.fillRect(M.x-2, M.y, M.w + 4, BoxHeight);\n"12995" context.fillStyle = bgcolor;\n"12996" context.fillRect(M.x, M.y, M.w, BoxHeight);\n"12997" context.fillStyle = color;\n"12998" context.fillText(Name, M.x, YText);\n"12999" context.textAlign = \'right\';\n"13000" context.fillText(\'\' + Value, M.x + M.w - 2, YText);\n"13001" context.textAlign = \'left\';\n"13002" M.cidx = 1-M.cidx;\n"13003" M.y += BoxHeight;\n"13004" return bMouseIn && MouseReleased;\n"13005"}\n"13006"function DrawMenuRoll(M, Name, RollValue, RollExt, RollFunction, Tweak, Type)\n"13007"{\n"13008" var context = CanvasDetailedView.getContext(\'2d\');\n"13009"\n"13010" var YText = M.y + BoxHeight - FontAscent;\n"13011" var SizeMinus = context.measureText(\'-\').width;\n"13012" var SizePlus = context.measureText(\'+\').width;\n"13013"\n"13014" var bMouseIn = MouseY >= M.y && MouseY < M.y + BoxHeight;\n"13015" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[M.cidx];\n"13016" context.fillStyle = bgcolor;\n"13017" context.fillRect(M.x-2, M.y, M.w+4, BoxHeight);\n"13018" context.fillStyle = \'white\';\n"13019" context.fillText(Name, M.x, YText);\n"13020" context.textAlign = \'right\';\n"13021" var XTemp = M.x + ";1302213023const size_t g_MicroProfileHtmlLive_begin_2_size = sizeof(g_MicroProfileHtmlLive_begin_2);13024const char g_MicroProfileHtmlLive_begin_3[] =13025"M.w - 3;\n"13026"\n"13027" if(KeyShiftDown && bMouseIn)\n"13028" {\n"13029" if(Tweak>=0)\n"13030" {\n"13031" RollFunction(0, MouseX-Tweak);\n"13032" }\n"13033" Tweak = MouseX;\n"13034" bMouseIn = false;\n"13035" }\n"13036" else\n"13037" {\n"13038" Tweak = -1;\n"13039" }\n"13040"\n"13041" var MouseReleasedUsed = false;\n"13042" if(bMouseIn && MouseX >= XTemp - SizePlus && MouseX <= XTemp)\n"13043" {\n"13044" context.fillStyle = \'red\';\n"13045" if(MouseReleased)\n"13046" {\n"13047" RollFunction(1);\n"13048" MouseReleasedUsed = true;\n"13049" }\n"13050" }\n"13051" else\n"13052" {\n"13053" context.fillStyle = \'white\';\n"13054" }\n"13055" context.fillText(\'+\', XTemp, YText);\n"13056" XTemp -= SizePlus + 3;\n"13057"\n"13058"\n"13059"\n"13060" if(bMouseIn && MouseX >= XTemp - SizeMinus && MouseX <= XTemp)\n"13061" {\n"13062" context.fillStyle = \'red\';\n"13063" if(MouseReleased)\n"13064" {\n"13065" RollFunction(-1);\n"13066" MouseReleasedUsed = true;\n"13067" }\n"13068" }\n"13069" else\n"13070" {\n"13071" context.fillStyle = \'white\';\n"13072" }\n"13073"\n"13074" context.fillText(\'-\', XTemp, YText);\n"13075" XTemp -= SizeMinus + 3;\n"13076" var RollText = \'\'+RollValue + RollExt;\n"13077" var RollWidth = context.measureText(RollText).width;\n"13078" context.fillStyle = \'white\';\n"13079"\n"13080" context.fillText(RollText, XTemp, YText);\n"13081" XTemp -= RollWidth;\n"13082"\n"13083" context.textAlign = \'left\';\n"13084"\n"13085" M.cidx = 1-M.cidx;\n"13086"\n"13087" M.y += BoxHeight;\n"13088" if(Type && MouseReleased && bMouseIn && !MouseReleasedUsed)\n"13089" {\n"13090" var V = ShowPrompt(Name, RollValue, Type);\n"13091" RollFunction(0,0,V);\n"13092" }\n"13093" return Tweak;\n"13094"\n"13095"}\n"13096"function CheckPopupAllowed()\n"13097"{\n"13098" if(!PopupsAllowed && !PopupTestPending)\n"13099" {\n"13100" PopupTestPending = 1;\n"13101" PopupsAllowed = 0;\n"13102" PopupsFailed = 0;\n"13103" let DoPopupTest = function()\n"13104" {\n"13105" var W = window.open(\"about:blank\");\n"13106" var Fail = function()\n"13107" {\n"13108" PopupTestPending = 0;\n"13109" PopupsFailed = 1;\n"13110" PopupsAllowed = 0;\n"13111" };\n"13112" var Check = function()\n"13113" {\n"13114" if(!(W.innerHeight>0))\n"13115" Fail();\n"13116" else\n"13117" {\n"13118" PopupTestPending = 0;\n"13119" PopupsFailed = 0;\n"13120" PopupsAllowed = 1;\n"13121" W.close();\n"13122" }\n"13123" };\n"13124" if(W)\n"13125" {\n"13126" if(/chrome/.test(navigator.userAgent.toLowerCase()))\n"13127" setTimeout(Check, 200);\n"13128" else\n"13129" W.onload = Check;\n"13130" }\n"13131" else\n"13132" {\n"13133" Fail();\n"13134" }\n"13135" };\n"13136" setTimeout(DoPopupTest, 5000);\n"13137" }\n"13138"}\n"13139"\n"13140"function GetSubGraphReferenceTime(T, SubGraphSettings, TimerState)\n"13141"{\n"13142" if(SubGraphSettings.AutomaticReference)\n"13143" {\n"13144" return TimerState.historymaxsoft ? TimerState.historymax : TimerState.historymax;\n"13145" }\n"13146" else\n"13147" {\n"13148" if(T.idtype == TYPE_COUNTER && T.format == FormatCounterBytes)\n"13149" {\n"13150" return (1 << (10*SubGraphSettings.Bytes)) * SubGraphSettings.ReferenceTime;\n"13151" }\n"13152" else\n"13153" {\n"13154" return SubGraphSettings.ReferenceTime;\n"13155" }\n"13156" }\n"13157"}\n"13158"\n"13159"function GetSubGraphSettings(key)\n"13160"{\n"13161" let Source = Settings.ViewActive == VIEW_GRAPH_PERCENTILE ? Settings.SubGraphSettingsPercentile : Settings.SubGraphSettings;\n"13162" let SubGraphSettings = Source[key];\n"13163" if(!SubGraphSettings)\n"13164" {\n"13165" SubGraphSettings = {\"ReferenceTime\":10.0, \"TargetTime\":-1, \"AutomaticReference\":1, \"Percentile\":0.0, \"Bytes\":0};\n"13166" Source[key] = SubGraphSettings;\n"13167" }\n"13168" if(!SubGraphSettings.Bytes)\n"13169" SubGraphSettings.Bytes = 0;\n"13170" return SubGraphSettings;\n"13171"}\n"13172"\n"13173"\n"13174"function DrawMenuGraphSettings()\n"13175"{\n"13176" let Percentile = Settings.ViewActive == VIEW_GRAPH_PERCENTILE;\n"13177" let Selection = null;\n"13178" let SizeInfo = {};\n"13179" SizeInfo.h = (Percentile?3:2) * BoxHeight;\n"13180" let Strings = [\"AutoCapture Enabled\", \"AutoCapture Threshold\", \"AutoCapture Source\", \"Capture Length\"];\n"13181" let wLeft = MeasureArray(0, Strings);\n"13182" let wRight = 50;\n"13183" wRight = MeasureArray(wRight, [\"Frame Time\"]);\n"13184" let Width = wLeft + 35 + wRight;\n"13185" SizeInfo.w = Width;\n"13186" SizeInfo.x = Math.floor(CaptureButtonX);\n"13187" SizeInfo.y = Math.floor(CaptureButtonY);\n"13188"\n"13189" let M = CreateMenuState(SizeInfo);\n"13190" let context = CanvasDetailedView.getContext(\'2d\');\n"13191" context.fillRect(M.x, M.y, Width, SizeInfo.h);\n"13192" let SubGraphSettings = GetSubGraphSettings(SubMenuGraphSettingsKey);\n"13193" let idx = GetTimerFromFullName(SubMenuGraphSettingsKey);\n"13194" let T = TimerArray[idx];\n"13195" const IsByteCounter = T.idtype == TYPE_COUNTER && T.format == FormatCounterBytes;\n"13196" \n"13197" let RefTime = SubGraphSettings.ReferenceTime;\n"13198" ReferenceTimeTweak = DrawMenuRoll(M, \"Reference Value\", SubGraphSettings.ReferenceTime, \'\', ReferenceRollSubGraph, ReferenceTimeTweak, \'float\');\n"13199" if(RefTime != SubGraphSettings.ReferenceTime)\n"13200" SubGraphSettings.AutomaticReference = 0;\n"13201"\n"13202" if(IsByteCounter)\n"13203" {\n"13204" DrawMenuRoll(M, \"\", CounterByteNames[SubGraphSettings.Bytes], \'\', ReferenceRollBytes, -1);\n"13205" }\n"13206" if(DrawMenuElement(M, SubGraphSettings.AutomaticReference, \"Automatic Reference Value\", SubGraphSettings.AutomaticReference, \'white\'))\n"13207" {\n"13208" SubGraphSettings.AutomaticReference = 1-SubGraphSettings.AutomaticReference;\n"13209" }\n"13210" function ClearPercentile(SettingsKey)\n"13211" {\n"13212" let idx = GetTimerFromFullName(SettingsKey);\n"13213" let T = TimerArray[idx];\n"13214" let TimerMap = FrameData.TimerMap;\n"13215" if(TimerMap)\n"13216" {\n"13217" let TimerState = TimerMap[T.id];\n"13218" TimerState.PercentileMax = -1e38;\n"13219" TimerState.PercentileMin = 1e38;\n"13220" TimerState.Percentile = new Float32Array(PERCENTILE_SAMPLES);\n"13221" TimerState.Percentile.fill(0.0);\n"13222" TimerState.PercentileCount = 0;\n"13223" }\n"13224" }\n"13225" if(Percentile)\n"13226" {\n"13227" if(DrawMenuElement(M, 0, \"Clear Percentile\", \"\", \'white\'))\n"13228" {\n"13229" ClearPercentile(SubMenuGraphSettingsKey);\n"13230" }\n"13231" }\n"13232"\n"13233" DrawMenuElement(M, 0, \"---------- \", \"\", \'white\');\n"13234" let Apply = function(Callback){\n"13235" let AllSettings = Percentile ? Settings.SubGraphSettingsPercentile : Settings.SubGraphSettings;\n"13236" for(let key in AllSettings)\n"13237" {\n"13238" let idx = GetTimerFromFullName(key);\n"13239" if(idx)\n"13240" {\n"13241" let T0 = TimerArray[idx];\n"13242" if(T0.idtype == T.idtype && T.format == T0.format)\n"13243" {\n"13244" Callback(AllSettings[key], key);\n"13245" }\n"13246" }\n"13247" } \n"13248" }\n"13249" {\n"13250" let str = T.idtype == TYPE_TIMER ? \"TIMERS\" : (T.format == FormatCounterBytes ? \"BYTE COUNTERS\" : \"COUNTERS\");\n"13251" if(DrawMenuElement(M, 0, \"Copy to All \" + str + \" Graphs \", \"\", \'white\'))\n"13252" {\n"13253" Apply(function(T){\n"13254" T.ReferenceTime = SubGraphSettings.ReferenceTime;\n"13255" });\n"13256" if(IsByteCounter)\n"13257" {\n"13258" Apply(function(T){\n"13259" T.Bytes = SubGraphSettings.Bytes;\n"13260" });\n"13261" }\n"13262" Apply(function(T){\n"13263" T.AutomaticReference = SubGraphSettings.AutomaticReference;\n"13264" }); \n"13265" }\n"13266" if(Percentile)\n"13267" {\n"13268" if(DrawMenuElement(M, 0, \"Clear All Percentile\", \"\", \'white\'))\n"13269" {\n"13270" ClearPercentile(SubMenuGraphSettingsKey);\n"13271" Apply(function(T, k){\n"13272" ClearPercentile(k);\n"13273" });\n"13274" }\n"13275" }\n"13276" }\n"13277" DrawMenuElement(M, 0, \"--- SHARED --- \", \"\", \'white\');\n"13278" DrawMenuRoll(M, \"Soft Mode\", GraphSoftFrameModeNames[Settings.GraphSoftMode], \'\', RollSoftFrameNames, -1);\n"13279" DrawMenuRoll(M, \"Soft Frames\", Settings.GraphSoftFrames, \'\', RollSoftFrames, -1);\n"13280"\n"13281"\n"13282" SizeInfo.h = M.y - SizeInfo.y;\n"13283" return SizeInfo;\n"13284"\n"13285"}\n"13286"\n"13287"function Dots()\n"13288"{\n"13289" let t = new Date().getMilliseconds() / 200;\n"13290" let dots = [\". \",\".. \",\"...\",\".. \"];\n"13291" let x = Math.floor(t) %4;\n"13292" return dots[x];\n"13293"}\n"13294"\n"13295"function DrawMenuCapture()\n"13296"{\n"13297" let Selection = null;\n"13298" let SizeInfo = {};\n"13299" SizeInfo.h = 7 * BoxHeight;\n"13300" let Strings = [\"Popups Allowed\", \"AutoCapture Enabled\", \"AutoCapture Threshold\", \"AutoCapture Source\", \"Capture Length\", \"Capture Delay\"];\n"13301" let wLeft = MeasureArray(0, Strings);\n"13302" let wRight = 50;\n"13303" wRight = MeasureArray(wRight, [\"Frame Time\"]);\n"13304" wRight = MeasureArray(wRight, EnabledArray, function(a){return TimerArray[a].name; } );\n"13305" let Width = wLeft + 35 + wRight;\n"13306" SizeInfo.w = Width;\n"13307" SizeInfo.x = CaptureButtonX - SizeInfo.w;\n"13308" SizeInfo.y = CaptureButtonY - SizeInfo.h;\n"13309"\n"13310" let M = CreateMenuState(SizeInfo);\n"13311" let context = CanvasDetailedView.getContext(\'2d\');\n"13312" context.fillRect(M.x, M.y, Width, SizeInfo.h);\n"13313" let d = Dots();\n"13314" let PopupStatus = PopupsAllowed ? \"Yes\" : (PopupsFailed ? \"No\" : (PopupTestPending ? (\"Testing\"+d) : \"Untested\"));\n"13315" if(DrawMenuElement(M, 0, \"Popups Allowed\", PopupStatus, \'white\', 0))\n"13316" {\n"13317" CheckPopupAllowed();\n"13318" }\n"13319" let AutoStatus = AutoCaptureEnabled > 0 ? \"on\" : \"off\";\n"13320" if(CaptureTriggerTime != null && CaptureTriggerTimeType == 2)\n"13321" {\n"13322" AutoStatus = \"pending\"+d;\n"13323" }\n"13324" if(DrawMenuElement(M, 0, \"AutoCapture Enabled\", AutoStatus, \'white\', 0))\n"13325" {\n"13326" if(!AutoCaptureEnabled && CaptureTriggerTime == null)\n"13327" {\n"13328" if(Settings.CaptureDelay <= 0)\n"13329" {\n"13330" AutoCaptureEnabled = Settings.AutoCaptureRepeat > 0 ? Settings.AutoCaptureRepeat : 1;\n"13331" }\n"13332" else\n"13333" {\n"13334" CaptureTriggerTime = new Date();\n"13335" CaptureTriggerTimeType = 2;\n"13336" }\n"13337" }\n"13338" else\n"13339" {\n"13340" AutoCaptureEnabled = 0;\n"13341" if(CaptureTriggerTimeType == 2)\n"13342" {\n"13343" CaptureTriggerTimeType = 0;\n"13344" CaptureTriggerTime = null;\n"13345" }\n"13346" }\n"13347" }\n"13348" AutoCaptureSourceTweak = DrawMenuRoll(M, \"AutoCapture Source\", GetAutoCaptureString(), \'\', AutoCaptureSourceRoll, AutoCaptureSourceTweak);\n"13349" AutoCaptureTweak = DrawMenuRoll(M, \"AutoCapture Threshold\", Settings.AutoCaptureTheshold, \'ms\', AutoCaptureRoll, AutoCaptureTweak, \'int\');\n"13350" AutoCaptureRepeatTweak = DrawMenuRoll(M, \"AutoCapture Repeat\", Settings.AutoCaptureRepeat, \'\', AutoCaptureRepeatRoll, AutoCaptureRepeatTweak, \'int\');\n"13351" CaptureTweak = DrawMenuRoll(M, \"Capture Length\", Settings.CaptureFrames, \'\', CaptureRoll, CaptureTweak, \'int\');\n"13352" CaptureDelayTweak = DrawMenuRoll(M, \"Capture Delay\", Settings.CaptureDelay, \'\', CaptureDelayRoll, CaptureDelayTweak, \'int\');\n"13353"\n"13354" SizeInfo.h = M.y - SizeInfo.y;\n"13355" return SizeInfo;\n"13356"\n"13357"}\n"13358"function WindowRect(x,y,w,h)\n"13359"{\n"13360" let s = {};\n"13361" s.x = x;\n"13362" s.y = y;\n"13363" s.w = w;\n"13364" s.h = h;\n"13365" return s;\n"13366"}\n"13367"function GetAggregateString()\n"13368"{\n"13369" if(0 == Settings.AggregateFrames)\n"13370" return \'infinite\';\n"13371" else\n"13372" return Settings.AggregateFrames + \'\';\n"13373"}\n"13374"\n"13375"function AggregateRoll(Direction, Tweak, SetDirect)\n"13376"{\n"13377" if(SetDirect || SetDirect == 0)\n"13378" {\n"13379" if(SetDirect <= 0 || SetDirect == \'infinite\')\n"13380" {\n"13381" Settings.AggregateFrames = 0;\n"13382" }\n"13383" else\n"13384" {\n"13385" Settings.AggregateFrames = SetDirect;\n"13386" }\n"13387" }\n"13388" else if(Tweak)\n"13389" {\n"13390" Settings.AggregateFrames = TweakValue(Settings.AggregateFrames, Tweak, 0.98, 0, 500);\n"13391"\n"13392" }\n"13393" else if(Direction)\n"13394" {\n"13395" Settings.AggregateFrames = NextValue(AggregatePresets, Settings.AggregateFrames, Direction);\n"13396" }\n"13397"}\n"13398"function ReferenceRoll(Direction, Tweak, SetDirect)\n"13399"{\n"13400" if(SetDirect)\n"13401" {\n"13402" Settings.ReferenceTime = SetDirect;\n"13403" }\n"13404" else if(Tweak)\n"13405" {\n"13406" Settings.ReferenceTime = TweakValue(Settings.ReferenceTime, Tweak, 0.98, 0.01, 1000);\n"13407"\n"13408" }\n"13409" else if(Direction)\n"13410" {\n"13411" Settings.ReferenceTime = NextValue(ReferencePresets, Settings.ReferenceTime, Direction);\n"13412" }\n"13413"}\n"13414"\n"13415"function ReferenceRollSubGraph(Direction, Tweak, SetDirect)\n"13416"{\n"13417" let SubGraphSettings = GetSubGraphSettings(SubMenuGraphSettingsKey);\n"13418" if(SetDirect)\n"13419" {\n"13420" SubGraphSettings.ReferenceTime = SetDirect;\n"13421" }\n"13422" else if(Tweak)\n"13423" {\n"13424" SubGraphSettings.ReferenceTime = TweakValue(SubGraphSettings.ReferenceTime, Tweak, 0.98, 0.001, 1000);\n"13425"\n"13426" }\n"13427" else if(Direction)\n"13428" {\n"13429" SubGraphSettings.ReferenceTime = NextValue(ReferencePresets, SubGraphSettings.ReferenceTime, Direction);\n"13430" }\n"13431"}\n"13432"\n"13433"function RollSoftFrames(Direction, Tweak, SetDirect)\n"13434"{\n"13435" if(SetDirect)\n"13436" {\n"13437" Settings.GraphSoftFrames = SetDirect;\n"13438" }\n"13439" else if(Tweak)\n"13440" {\n"13441" Settings.GraphSoftFrames = TweakValue(Settings.GraphSoftFrames, Tweak, 0.98, 2, 30);\n"13442"\n"13443" }\n"13444" else if(Direction)\n"13445" {\n"13446" Settings.GraphSoftFrames = NextValue(GraphSoftFramePresets, Settings.GraphSoftFrames , Direction);\n"13447" }\n"13448"}\n"13449"\n"13450"function ReferenceRollBytes(Direction, Tweak, SetDirect)\n"13451"{\n"13452" let SubGraphSettings = GetSubGraphSettings(SubMenuGraphSettingsKey);\n"13453" if(SetDirect)\n"13454" {\n"13455" debugger;\n"13456" }\n"13457" else if(Tweak)\n"13458" {\n"13459" debugger;\n"13460" }\n"13461" else if(Direction)\n"13462" {\n"13463" SubGraphSettings.Bytes = (SubGraphSettings.Bytes + Direction);\n"13464" if(SubGraphSettings.Bytes<0)\n"13465" SubGraphSettings.Bytes = CounterByteNames.length-1;\n"13466" }\n"13467"}\n"13468"\n"13469"\n"13470"function RollSoftFrameNames(Direction, Tweak, SetDirect)\n"13471"{\n"13472" if(Direction)\n"13473" {\n"13474" Settings.GraphSoftMode = (Settings.GraphSoftMode + Direction);\n"13475" if(Settings.GraphSoftMode < 0)\n"13476" Settings.GraphSoftMode = GraphSoftFrameModeNames.length-1;\n"13477" if(Settings.GraphSoftMode >= GraphSoftFrameModeNames.length)\n"13478" Settings.GraphSoftMode = 0\n"13479" }\n"13480"\n"13481"}\n"13482"\n"13483"function PercentileRollSubGraph(Direction, Tweak, SetDirect)\n"13484"{\n"13485" let SubGraphSettings = GetSubGraphSettings(SubMenuGraphSettingsKey);\n"13486" if(SetDirect)\n"13487" {\n"13488" SubGraphSettings.Percentile = SetDirect;\n"13489" }\n"13490" else if(Tweak)\n"13491" {\n"13492" SubGraphSettings.Percentile = TweakValue(SubGraphSettings.Percentile, Tweak, 0.98, 5, 1000);\n"13493" }\n"13494" else if(Direction)\n"13495" {\n"13496" SubGraphSettings.Percentile = NextValue(PercentilePresets, SubGraphSettings.Percentile, Direction);\n"13497" }\n"13498"}\n"13499"\n"13500"\n"13501"function TargetRoll(Direction, Tweak, SetDirect)\n"13502"{\n"13503" if(SetDirect)\n"13504" {\n"13505" Settings.TargetTime = SetDirect;\n"13506" }\n"13507" else if(Tweak)\n"13508" {\n"13509" Settings.TargetTime = TweakValue(Settings.TargetTime, Tweak, 0.98, 0.01, 1000);\n"13510"\n"13511" }\n"13512" else if(Direction)\n"13513" {\n"13514" Settings.TargetTime = NextValue(ReferencePresets, Settings.TargetTime, Direction);\n"13515" }\n"13516"}\n"13517"function TargetRollSubGraph(Direction, Tweak, SetDirect)\n"13518"{\n"13519" let SubGraphSettings = GetSubGraphSettings(SubMenuGraphSettingsKey);\n"13520" if(SetDirect)\n"13521" {\n"13522" SubGraphSettings.TargetTime = SetDirect;\n"13523" }\n"13524" else if(Tweak)\n"13525" {\n"13526" SubGraphSettings.TargetTime = TweakValue(SubGraphSettings.TargetTime, Tweak, 0.98, 5, 1000);\n"13527"\n"13528" }\n"13529" else if(Direction)\n"13530" {\n"13531" SubGraphSettings.TargetTime = NextValue(ReferencePresets, SubGraphSettings.TargetTime, Direction);\n"13532" }\n"13533"}\n"13534"\n"13535"function ToggleCompressedView()\n"13536"{\n"13537" Settings.ViewCompressed = 1-Settings.ViewCompressed;\n"13538" if(Settings.ViewCompressed)\n"13539" ViewCompressedTimeout = 3000.0;\n"13540" ResizeCanvas();\n"13541"}\n"13542"\n"13543"function DrawMenuSettings()\n"13544"{\n"13545" var context = CanvasDetailedView.getContext(\'2d\');\n"13546" var nColorIndex = 0;\n"13547" var SizeInfo = AggregateMenuSize();\n"13548" SizeInfo.x = MenuItems[SubMenuSettings].x;\n"13549" SizeInfo.y = MenuItems[SubMenuSettings].y;\n"13550"\n"13551" SizeInfo.w = 200;\n"13552" var M = CreateMenuState(SizeInfo);\n"13553"\n"13554" AggregateTweak = DrawMenuRoll(M, \"Aggregate Frames\", GetAggregateString(), \'\', AggregateRoll, AggregateTweak, \'int\');\n"13555" ReferenceTimeTweak = DrawMenuRoll(M, \"Reference Time\", Settings.ReferenceTime, \'\', ReferenceRoll, ReferenceTimeTweak, \'float\');\n"13556" TargetTimeTweak = DrawMenuRoll(M, \"Target Time\", Settings.TargetTime, \'\', TargetRoll, TargetTimeTweak, \'float\');\n"13557" if(DrawMenuElement(M, Settings.AutomaticReference, \"Automatic Reference Time\", Settings.AutomaticReference, \'white\'))\n"13558" {\n"13559" Settings.AutomaticReference = 1-Settings.AutomaticReference;\n"13560" }\n"13561" if(DrawMenuElement(M, Settings.ViewCompressed, \"Compressed View\", Settings.ViewCompressed, \'white\'))\n"13562" {\n"13563" ToggleCompressedView();\n"13564" }\n"13565"\n"13566" if(Settings.AggregateFrames <= 0)\n"13567" {\n"13568" if(DrawMenuElement(M, 0, \"Clear Aggregate\", \"Current[\" + AggregateCurrent + \"]\", \'white\'))\n"13569" {\n"13570" WSSendMessage(\"r\");\n"13571" }\n"13572" }\n"13573" if(DrawMenuElement(M, 0, \"Clear Percentile Aggregate\", \"\", \'white\'))\n"13574" {\n"13575" let TimerMap = FrameData.TimerMap;\n"13576" if(TimerMap)\n"13577" {\n"13578" for(let key in TimerMap)\n"13579" {\n"13580" let idx = GetTimer(key);\n"13581" let TimerState = TimerMap[key];\n"13582" if(!IsGroup(key) && TimerState.Percentile)\n"13583" {\n"13584" TimerState.PercentileMax = -1e38;\n"13585" TimerState.PercentileMin = 1e38;\n"13586" TimerState.Percentile = new Float32Array(PERCENTILE_SAMPLES);\n"13587" TimerState.Percentile.fill(0.0);\n"13588" TimerState.PercentileCount = 0;\n"13589" }\n"13590" }\n"13591" }\n"13592" }\n"13593"\n"13594"\n"13595" if(DrawMenuElement(M, Settings.AllowHighDPI, \"Allow High DPI\", Settings.AllowHighDPI, \'white\'))\n"13596" {\n"13597" Settings.AllowHighDPI = 1 - Settings.AllowHighDPI;\n"13598" ResizeCanvas();\n"13599" }\n"13600" if(DrawMenuElement(M, Cookie.CodeReportMode == 0, \"Code Report: Prompt\", Cookie.CodeReportMode == 0 ? 1 : 0, \'white\'))\n"13601" {\n"13602" Cookie.CodeReportMode = 0;\n"13603" WriteCookie();\n"13604" }\n"13605"\n"13606" if(DrawMenuElement(M, Cookie.CodeReportMode == 1, \"Code Report: Report Silently\", Cookie.CodeReportMode == 1 ? 1 : 0, \'white\'))\n"13607" {\n"13608" Cookie.CodeReportMode = 1;\n"13609" WriteCookie();\n"13610" }\n"13611" if(DrawMenuElement(M, Cookie.CodeReportMode == 2, \"Code Report: Never Report\", Cookie.CodeReportMode == 2 ? 1 : 0, \'white\'))\n"13612" {\n"13613" Cookie.CodeReportMode = 2;\n"13614" WriteCookie();\n"13615" }\n"13616"\n"13617" SizeInfo.h = M.y - SizeInfo.y;\n"13618" return SizeInfo;\n"13619"}\n"13620"\n"13621"function MoveFilterInputDiv(x, y, w)\n"13622"{\n"13623" if(FilterInputDivPos.x != x || FilterInputDivPos.y != y || FilterInputDivPos.w != w)\n"13624" {\n"13625" FilterInputDivPos.x = x;\n"13626" FilterInputDivPos.y = y;\n"13627" FilterInputDivPos.w = w;\n"13628" FilterInputDiv.style[\'left\'] = x + \'px\';\n"13629" FilterInputDiv.style[\'top\'] = y + \'px\';\n"13630" FilterInput.style[\'width\'] = w + \'px\';\n"13631" }\n"13632"}\n"13633"\n"13634"function DrawMenuTimer()\n"13635"{\n"13636" if(FilterInputValueLast != FilterInput.value)\n"13637" {\n"13638" nOffsetMenuTimers = 0;\n"13639" }\n"13640" FilterInputValueLast = FilterInput.value;\n"13641" var FilterArray = CreateFilter(FilterInput.value);\n"13642" var context = CanvasDetailedView.getContext(\'2d\');\n"13643" var nColorIndex = 0;\n"13644" var SizeInfo = TimerMenuSize();\n"13645" SizeInfo.x = MenuItems[SubMenuTimers].x;\n"13646" SizeInfo.y = MenuItems[SubMenuTimers].y;\n"13647" var Y = SizeInfo.y;\n"13648" var Width = SizeInfo.w;\n"13649" var Selection = null;\n"13650" var X = SizeInfo.x;\n"13651" MoveFilterInputDiv(SizeInfo.x, SizeInfo.y, SizeInfo.w);\n"13652" Y += 35;\n"13653"\n"13654" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"13655" var bMouseInClear = MouseY >= Y && MouseY < Y + BoxHeight;\n"13656" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"13657" var TextY = Y+BoxHeight-FontAscent;\n"13658" var YClear = Y;\n"13659" var TextYClear = TextY;\n"13660" var YStart = Y;\n"13661"\n"13662" var MouseTaken = bMouseIn;\n"13663"\n"13664" Y += BoxHeight;\n"13665" nColorIndex = 1-nColorIndex;\n"13666"\n"13667" Y -= nOffsetMenuTimers;\n"13668"\n"13669" for(var i = 0; i < TimerArray.length; ++i)\n"13670" {\n"13671" var v = TimerArray[i];\n"13672" if(v.idtype == TYPE_TIMER\n"13673" //|| v.idtype == TYPE_GROUP\n"13674" )\n"13675" {\n"13676" var Name = v.name;\n"13677" var ParentName = TimerArray[v.parent].name;\n"13678" if(FilterMatch(FilterArray, ParentName + \" \" + Name) && (0 == TimersActiveOnly || v.e))\n"13679" {\n"13680" if(Y > YStart)\n"13681" {\n"13682" var ParentColor = TimerArray[v.parent].e ? \'white\' : \'grey\';\n"13683" bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight && !MouseTaken;\n"13684" bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"13685" TextY = Y+BoxHeight-FontAscent;\n"13686" context.fillStyle = v.e?\'white\':bgcolor;\n"13687" context.fillRect(X-2, Y, Width+4, BoxHeight);\n"13688" context.fillStyle = bgcolor;\n"13689" context.fillRect(X, Y, Width, BoxHeight);\n"13690" context.fillStyle = ParentColor;\n"13691" context.fillText(ParentName, X + 2, TextY);\n"13692" context.fillStyle = v.color;\n"13693" context.textAlign = \'right\';\n"13694" context.fillText(Name, X + Width - 2, TextY);\n"13695" context.textAlign = \'left\';\n"13696" if(bMouseIn)\n"13697" {\n"13698" Selection = v.id;\n"13699" }\n"13700" }\n"13701" Y += BoxHeight;\n"13702" nColorIndex = 1-nColorIndex;\n"13703" }\n"13704" }\n"13705" }\n"13706"\n"13707" {\n"13708"\n"13709" var c0 = nBackColorOffset;\n"13710" var c1 = nBackColors[1];\n"13711" var W = Width + 4;\n"13712" var WHalf = W / 2;\n"13713" var InsideClear = bMouseInClear && MouseX-X< WHalf-1;\n"13714" var InsideActive = bMouseInClear && MouseX-X > WHalf+1;\n"13715" context.fillStyle = nBackColors[0];\n"13716" context.fillRect(X-2, YClear, W, BoxHeight);\n"13717"\n"13718" context.fillStyle = InsideClear ? c0 :c1;\n"13719" context.fillRect(X-2, YClear, WHalf-1, BoxHeight);\n"13720" context.fillStyle = InsideActive ? c0 :c1;\n"13721" context.fillRect(X-2 + WHalf + 1, YClear, WHalf-1, BoxHeight);\n"13722"\n"13723"\n"13724" context.fillStyle = \'white\';\n"13725" context.textAlign = \'center\';\n"13726" context.fillText(\"[clear] \", X + 2 + Width * 0.25, TextYClear);\n"13727" context.fillStyle = TimersActiveOnly ? \'white\' : \'grey\';\n"13728" context.fillText(\"[active only]\", X + 2 + Width * 0.75, TextYClear);\n"13729" if(MouseReleased)\n"13730" {\n"13731" if(InsideActive)\n"13732" {\n"13733" TimersActiveOnly = 1-TimersActiveOnly;\n"13734" }\n"13735" if(InsideClear)\n"13736" {\n"13737" WSSendMessage(\"x\");\n"13738" }\n"13739" }\n"13740" }\n"13741" context.textAlign = \'left\';\n"13742" if(Selection && MouseReleased && !MouseTaken)\n"13743" {\n"13744" WSSendMessage(\"c\" + Selection);\n"13745" }\n"13746" SizeInfo.h = Y-SizeInfo.y;\n"13747" return SizeInfo;\n"13748"}\n"13749"\n"13750"var LoadSymbolAnim = -1;\n"13751"function LoadSymbolAnimRestart()\n"13752"{\n"13753" if(LoadSymbolAnim > 0)\n"13754" {\n"13755" LoadSymbolAnim += 1;\n"13756" }\n"13757" else\n"13758" {\n"13759" LoadSymbolAnim = 1;\n"13760" }\n"13761"}\n"13762"function LoadSymbolAnimUpdateAndGet()\n"13763"{\n"13764" if(LoadSymbolAnim>=0)\n"13765" {\n"13766" LoadSymbolAnim -= 0.03;\n"13767" if(LoadSymbolAnim < 0)\n"13768" {\n"13769" LoadSymbolAnim = -1;\n"13770" }\n"13771" else\n"13772" {\n"13773" return Math.sin(3.14 * LoadSymbolAnim);\n"13774" }\n"13775"\n"13776" }\n"13777" return -1;\n"13778"}\n"13779"\n"13780"\n"13781"var CircleSteps = 30;\n"13782"var CircleX = Array(CircleSteps);\n"13783"var CircleY = Array(CircleSteps);\n"13784"function InitCircle()\n"13785"{\n"13786" var twopi = 2 * Math.PI;\n"13787" for(var i = 0; i < CircleSteps; ++i)\n"13788" {\n"13789" var s = (1.0*i) / CircleSteps;\n"13790"\n"13791" var f = (1.0 * s) * twopi;\n"13792" CircleX[i] = Math.sin(f);\n"13793" CircleY[i] = Math.cos(f);\n"13794" }\n"13795"}\n"13796"function SpinnerResize(Spinner, w, h)\n"13797"{\n"13798" if(h != Spinner.CanvasH || w != Spinner.CanvasW || DPR != Spinner.CanvasDPR)\n"13799" {\n"13800" Spinner.Canvas.style.width = w + \'px\';\n"13801" Spinner.Canvas.style.height = h + \'px\';\n"13802" Spinner.Canvas.width = w * DPR;\n"13803" Spinner.Canvas.height = h * DPR;\n"13804" Spinner.Canvas.getContext(\'2d\').scale(DPR, DPR);\n"13805" Spinner.CanvasBack.style.width = w + \'px\';\n"13806" Spinner.CanvasBack.style.height = h + \'px\';\n"13807" Spinner.CanvasBack.width = w * DPR;\n"13808" Spinner.CanvasBack.height = h * DPR;\n"13809"\n"13810" Spinner.CanvasBack.getContext(\'2d\').scale(DPR, DPR);\n"13811" Spinner.CanvasH = h;\n"13812" Spinner.CanvasW = w;\n"13813" Spinner.CanvasDPR = DPR;\n"13814" }\n"13815"}\n"13816"function SpinnerCircle(Phase0, Shift0, Phase1, Shift1, Phase2, Shift2)\n"13817"{\n"13818" return {\"Phase0\" : Phase0, \"Shift0\": Shift0, \"Phase1\":Phase1, \"Shift1\":Shift1, \"Phase2\": Phase2, \"Shift2\": Shift2, \"Q\": 0, \"QQ\": 0, \"A0\":0, \"A1\":0, \"A2\":0};\n"13819"}\n"13820"\n"13821"function SpinnerInit(Blur, Color)\n"13822"{\n"13823" var Spinner = {};\n"13824" Spinner.x = 0;\n"13825" Spinner.y = 0;\n"13826" Spinner.Canvas = document.createElement(\'canvas\');\n"13827" Spinner.CanvasBack = document.createElement(\'canvas\');\n"13828" Spinner.CanvasOffscreenData;\n"13829" Spinner.CanvasW = -1;\n"13830" Spinner.CanvasH = -1;\n"13831" Spinner.CanvasDPR = -1;\n"13832" Spinner.Circles = [];\n"13833" var x = 1 / 4;\n"13834" var y = 0.07;\n"13835" Spinner.Circles.push(SpinnerCircle(x, 0, y, 0, 0.0, 0.25));\n"13836" Spinner.Circles.push(SpinnerCircle(2/4, 0, 0, 0, 0.14, 0.25));\n"13837" Spinner.Fade = 0;\n"13838" Spinner.Blur = Blur;\n"13839" Spinner.Color = Color;\n"13840" return Spinner;\n"13841"}\n"13842"\n"13843"var SpinnerCorner = SpinnerInit(0.8, \'white\');\n"13844"var SpinnerLoadButton = SpinnerInit(0, \'white\');\n"13845"var SpinnerText1 = SpinnerInit(0.0, \'red\');\n"13846"var SpinnerText0 = SpinnerInit(0.0, \'red\');\n"13847"\n"13848"\n"13849"function SpinnerShow()\n"13850"{\n"13851" return SymbolState != null && (SymbolState.q == 1 || SymbolState.r != SymbolState.f || FunctionQueryLastRequest != FunctionQueryReceived);\n"13852"}\n"13853"\n"13854"function SpinnerDraw(Enable, context, Spinner, X, Y, w, h)\n"13855"{\n"13856" SpinnerResize(Spinner, w, h);\n"13857" var ContextSpinner = Spinner.Canvas.getContext(\'2d\');\n"13858"\n"13859"\n"13860" var now = Date.now();\n"13861" if(!ContextSpinner.last)\n"13862" {\n"13863" ContextSpinner.last = now;\n"13864" }\n"13865" var DT = now - ContextSpinner.last;\n"13866" ContextSpinner.last = now;\n"13867" if(Enable)\n"13868" {\n"13869" Spinner.Fade += DT / 200;\n"13870" }\n"13871" else\n"13872" {\n"13873" Spinner.Fade -= DT / 1000;\n"13874" }\n"13875" Spinner.Fade = Math.max(0, Spinner.Fade);\n"13876" Spinner.Fade = Math.min(1, Spinner.Fade);\n"13877" var F = Spinner.Fade * Spinner.Fade;\n"13878"\n"13879" if(Spinner.Fade <= 0)\n"13880" return;\n"13881" ContextSpinner.clearRect(0, 0, w, h);\n"13882" if(Spinner.Blur > 0)\n"13883" {\n"13884" ContextSpinner.globalAlpha = Spinner.Blur;\n"13885" ContextSpinner.drawImage(Spinner.CanvasBack, 0, 0, w, h);\n"13886" ContextSpinner.globalAlpha = 1.0;\n"13887" }\n"13888" var twopi = 2 * Math.PI;\n"13889" for(var jjj = 0; jjj < Spinner.Circles.length; ++jjj)\n"13890" {\n"13891" var C = Spinner.Circles[jjj];\n"13892" InitCircle();\n"13893" var xs = CircleX;\n"13894" var ys = CircleY;\n"13895" var scale = (w-2) / 2;\n"13896" var offset = (w) / 2;\n"13897" var SPEED = 100.0;\n"13898"\n"13899" var angle = (C.Q / SPEED) * twopi;\n"13900"\n"13901" var QQSPEED = 1000;\n"13902"\n"13903" C.A0 += (twopi * DT / 1000.0) * C.Phase0;\n"13904" if(C.A0 > twopi)\n"13905" C.A0 -= twopi;\n"13906" C.A1 += (twopi * DT / 1000.0) * C.Phase1;\n"13907" if(C.A1 > twopi)\n"13908" C.A1 -= twopi;\n"13909" C.A2 += (twopi * DT / 1000.0) * C.Phase2;\n"13910" if(C.A2 > twopi)\n"13911" C.A2 -= twopi;\n"13912"\n"13913" var A0 = C.A0 + twopi * C.Shift0;\n"13914" var A1 = C.A1 + twopi * C.Shift1;\n"13915" var A2 = C.A2 + twopi * C.Shift2;\n"13916" var m = Math.cos(A0);\n"13917" var m0 = Math.sin(A2);\n"13918" var cs = Math.cos(A1);\n"13919" var ss = Math.sin(A1);\n"13920" for(var i = 0; i < xs.length; ++i)\n"13921" {\n"13922" var x = xs[i] * m;\n"13923" var y = ys[i] * m0;\n"13924" xs[i] = cs * scale * x - ss * scale * y;\n"13925" ys[i] = ss * scale * x + cs * scale * y;\n"13926" xs[i] += offset;\n"13927" ys[i] += offset;\n"13928" }\n"13929" ContextSpinner.strokeStyle = Spinner.Color;\n"13930" ContextSpinner.beginPath();\n"13931" ContextSpinner.moveTo(xs[0], ys[0]);\n"13932" for(var i = 1; i < CircleSteps; ++i)\n"13933" {\n"13934" ContextSpinner.lineTo(xs[i], ys[i]);\n"13935" }\n"13936" ContextSpinner.lineTo(xs[0], ys[0]);\n"13937" ContextSpinner.stroke();\n"13938"\n"13939"\n"13940" }\n"13941" context.globalAlpha = F;\n"13942" context.drawImage(Spinner.Canvas, X, Y, w, h);\n"13943" context.globalAlpha = 1;\n"13944" var tmp = Spinner.CanvasBack;\n"13945" Spinner.CanvasBack = Spinner.Canvas;\n"13946" Spinner.Canvas = tmp;\n"13947"}\n"13948"\n"13949"\n"13950"function DrawMenuPatched()\n"13951"{\n"13952" if(FilterInputValueLast != FilterInput.value)\n"13953" {\n"13954" nOffsetMenuPatched = 0;\n"13955" }\n"13956"\n"13957" var FilterArray = CreateFilter(FilterInput.value);\n"13958" var context = CanvasDetailedView.getContext(\'2d\');\n"13959" var nColorIndex = 0;\n"13960" var SizeInfo = TimerMenuSize();\n"13961" SizeInfo.x = MenuItems[SubMenuPatched].x;\n"13962" SizeInfo.y = MenuItems[SubMenuPatched].y;\n"13963" var Y = SizeInfo.y;\n"13964" var Width = SizeInfo.w;\n"13965" Width = Math.max(300, Width);\n"13966" Width = 10+ MeasureArray(Width, FunctionsInstrumented, function(s, i){return s + \" \" + FunctionsInstrumentedModule[i];} );\n"13967"\n"13968" if(Width + SizeInfo.x + 50 > nWidth)\n"13969" {\n"13970" Width = nWidth - (SizeInfo.x+50);\n"13971" }\n"13972" SizeInfo.w = Width;\n"13973" var MaxStringLength = Math.floor(Width/(FontWidth));\n"13974"\n"13975" var Selection = null;\n"13976" var X = SizeInfo.x;\n"13977" context.fillStyle = nBackColors[0];\n"13978" TextY = Y+BoxHeight-FontAscent;\n"13979" context.fillRect(X, Y, Width, BoxHeight);\n"13980"\n"13981" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight && MouseX-X < 100;\n"13982" context.fillRect(X, Y, 99, BoxHeight);\n"13983" context.textAlign = \'center\';\n"13984" context.fillStyle = \'white\';\n"13985" context.fillText(\"Patched functions\", X + Width/2, TextY);\n"13986"\n"13987" Y += BoxHeight;\n"13988" MoveFilterInputDiv(SizeInfo.x, Y, SizeInfo.w-6);\n"13989" Y += 45;\n"13990"\n"13991" bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"13992" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"13993" var TextY = Y+BoxHeight-FontAscent;\n"13994" var YClear = Y;\n"13995" var TextYClear = TextY;\n"13996" var bgcolorClear = bgcolor;\n"13997" var YStart = Y-BoxHeight*2;\n"13998"\n"13999" nColorIndex = 1-nColorIndex;\n"14000"\n"14001" Y -= nOffsetMenuFunctions + 10;\n"14002" var Selection = -1;\n"14003"\n"14004" var StringColor = function(Name)\n"14005" {\n"14006" var h = StringHash(Name);\n"14007" var cidx = h % 360;\n"14008" return cidx;\n"14009" };\n"14010"\n"14011" var GetColor = function(Str)\n"14012" {\n"14013" var cidx = StringColor(Str);\n"14014" return \"hsl(\" + cidx + \",50%, 70%)\";\n"14015" };\n"14016" for(var i = 0; i < FunctionsInstrumented.length; ++i)\n"14017" {\n"14018" var Name = FunctionsInstrumented[i];\n"14019" var ModuleName = FunctionsInstrumentedModule[i];\n"14020" if(FilterMatch(FilterArray, ModuleName + \" \" + Name))\n"14021" {\n"14022"\n"14023" var Color = GetColor(Name);\n"14024" var ColorModule = GetColor(Name);\n"14025" if(Y >= YStart)\n"14026" {\n"14027" bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14028" bgcolor = bMouseIn && MouseX > X ? nBackColorOffset : nBackColors[nColorIndex];\n"14029" TextY = Y+BoxHeight-FontAscent;\n"14030"\n"14031" context.fillStyle = bgcolor;\n"14032" context.fillRect(X, Y, Width, BoxHeight);\n"14033" context.fillStyle = Color;\n"14034" context.textAlign = \'right\';\n"14035" context.fillText(Name, X + Width - 2, TextY);\n"14036" context.textAlign = \'left\';\n"14037" context.fillStyle = ColorModule;\n"14038" context.fillText(ModuleName, X, TextY);\n"14039" }\n"14040" Y += BoxHeight;\n"14041" nColorIndex = 1-nColorIndex;\n"14042" }\n"14043" }\n"14044" context.textAlign = \'left\';\n"14045" SizeInfo.h = Y-SizeInfo.y;\n"14046" return SizeInfo;\n"14047"}\n"14048"\n"14049"\n"14050"function DrawMenuModules()\n"14051"{\n"14052" if(FilterInputValueLast != FilterInput.value)\n"14053" {\n"14054" nOffsetMenuModules = 0;\n"14055" }\n"14056" FilterInputValueLast = FilterInput.value;\n"14057" let M = ModuleState;\n"14058" let FilterArray = CreateFilter(FilterInput.value);\n"14059" let context = CanvasDetailedView.getContext(\'2d\');\n"14060" let nColorIndex = 0;\n"14061" let SizeInfo = TimerMenuSize(); //broken, fix!\n"14062"\n"14063" SizeInfo.x = MenuItems[SubMenuModules].x;\n"14064" SizeInfo.y = MenuItems[SubMenuModules].y;\n"14065" let Y = SizeInfo.y;\n"14066" let Width = SizeInfo.w;\n"14067" Width = Math.max(300, Width);\n"14068" Width = 10+ MeasureArray(Width, M, function(s){return s.n + \" \" + s.s;} );\n"14069"\n"14070" if(Width + SizeInfo.x + 50 > nWidth)\n"14071" {\n"14072" Width = nWidth - (SizeInfo.x+50);\n"14073" }\n"14074" SizeInfo.w = Width;\n"14075"\n"14076"\n"14077" let MaxStringLength = Math.floor(Width/(FontWidth));\n"14078"\n"14079"\n"14080" let X = SizeInfo.x;\n"14081" DrawSymbolHeaderMenu(context, X, Y, Width);\n"14082"\n"14083" Y += BoxHeight;\n"14084" MoveFilterInputDiv(SizeInfo.x, Y, SizeInfo.w-6);\n"14085" Y += 45;\n"14086"\n"14087" let bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14088" let bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"14089" let TextY = Y+BoxHeight-FontAscent;\n"14090" let YClear = Y;\n"14091" let TextYClear = TextY;\n"14092" let bgcolorClear = bgcolor;\n"14093" let YStart = Y-BoxHeight*2;\n"14094"\n"14095" nColorIndex = 1-nColorIndex;\n"14096"\n"14097" Y -= nOffsetMenuModules + 10;\n"14098" let Selection = -1;\n"14099"\n"14100" let StringColor = function(Name)\n"14101" {\n"14102" let h = StringHash(Name);\n"14103" let cidx = h % 360;\n"14104" return cidx;\n"14105" };\n"14106"\n"14107" for(let i = 0; i < M.length; ++i)\n"14108" {\n"14109" let Name = M[i].n;\n"14110" let Count = M[i].s;\n"14111" let Prc = M[i].p;\n"14112" if(Prc<0||Prc>1)\n"14113" Prc = 0;\n"14114" let cidx = StringColor(Name);\n"14115" let Color = \"hsl(\" + cidx + \",50%, 70%)\";\n"14116" let C1 = \"hsl(\" + cidx + \",30%, 40%)\";\n"14117" let N = Name;\n"14118" if(M[i].d)\n"14119" N = N + \"[downloading]\";\n"14120" if(N.length > MaxStringLength)\n"14121" {\n"14122" N = N.substring(N.length - MaxStringLength);\n"14123" }\n"14124" if(FilterMatch(FilterArray, Name))\n"14125" {\n"14126"\n"14127" if(Y >= YStart)\n"14128" {\n"14129" bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14130" bgcolor = bMouseIn && MouseX > X ? nBackColorOffset : nBackColors[nColorIndex];\n"14131" TextY = Y+BoxHeight-FontAscent;\n"14132"\n"14133" context.fillStyle = bgcolor;\n"14134" context.fillRect(X, Y, Width, BoxHeight);\n"14135" if(Prc>0 && Prc <= 1)\n"14136" {\n"14137" context.fillStyle = C1;\n"14138" context.fillRect(X, Y, Prc*Width, BoxHeight);\n"14139" }\n"14140" context.fillStyle = \'white\';\n"14141" context.textAlign = \'right\';\n"14142" context.fillText(Count + \'\', X + Width - 2, TextY);\n"14143" context.textAlign = \'left\';\n"14144" context.fillStyle = Color;\n"14145" context.fillText(N, X, TextY);\n"14146" if(bMouseIn)\n"14147" {\n"14148" Selection = i;\n"14149" }\n"14150" }\n"14151" Y += BoxHeight;\n"14152" nColorIndex = 1-nColorIndex;\n"14153" }\n"14154" }\n"14155" context.textAlign = \'left\';\n"14156" if(Selection != -1 && MouseReleased)\n"14157" {\n"14158" WSSendMessage(\"L\" + M[Selection].n);\n"14159" }\n"14160" SizeInfo.h = Y-SizeInfo.y;\n"14161" return SizeInfo;\n"14162"}\n"14163"function DrawSymbolHeaderMenu(context, X, Y, Width)\n"14164"{\n"14165" context.fillStyle = nBackColors[0];\n"14166" let TextY = Y+BoxHeight-FontAscent;\n"14167" context.fillRect(X+100, Y, Width-100, BoxHeight);\n"14168" let bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight && MouseX-X < 100;\n"14169" if(bMouseIn)\n"14170" {\n"14171" context.fillStyle = nBackColorOffset;\n"14172" }\n"14173"\n"14174" context.fillRect(X, Y, 99, BoxHeight);\n"14175"\n"14176"\n"14177" let NumSymbols = 0;\n"14178" let SymbolStateString = \"Load all\";\n"14179" let SymbolButtonActive = 1;\n"14180" let SymbolSpinnerActive = 0;\n"14181" let FinishedSymbols = 0;\n"14182" if(SymbolState)\n"14183" {\n"14184" FinishedSymbols = SymbolState.f;\n"14185" var s = SymbolState.s;\n"14186" NumSymbols = SymbolState.l;\n"14187" SymbolButtonActive = 1;\n"14188" if(SymbolState.q == 1 || FunctionQueryLastRequest != FunctionQueryReceived)\n"14189" {\n"14190" SymbolStateString = \"Querying\";\n"14191" SymbolButtonActive = 0;\n"14192" SymbolSpinnerActive = 1;\n"14193" }\n"14194" else if(SymbolState.f != SymbolState.r)\n"14195" {\n"14196" SymbolButtonActive = 0;\n"14197" SymbolSpinnerActive = 1;\n"14198" SymbolStateString = \"Loading\";\n"14199" }\n"14200" else if(SymbolState.f == ModuleState.length)\n"14201" {\n"14202" SymbolButtonActive = 0;\n"14203" SymbolStateString = \"Loaded\";\n"14204" }\n"14205" }\n"14206" let LoadButtonAnimation = LoadSymbolAnimUpdateAndGet();\n"14207"\n"14208" context.textAlign = \'right\';\n"14209" context.fillStyle = \'white\';\n"14210" context.fillText(NumSymbols + \" Symbols \" + FinishedSymbols + \"/\" + ModuleState.length + \" Modules\", X+Width-2, TextY);\n"14211" context.textAlign = \'center\';\n"14212"\n"14213" if(LoadButtonAnimation>0)\n"14214" {\n"14215" var c = \"hsl(0,0%,\" + (LoadButtonAnimation * 100)+\"%)\";\n"14216" context.fillStyle = c;\n"14217" }\n"14218" if(SymbolButtonActive)\n"14219" {\n"14220" if(bMouseIn && MouseReleased)\n"14221" {\n"14222" WSSendMessage(\"S\"); //load symbols\n"14223" }\n"14224" context.fillText(SymbolStateString, X + 50, TextY);\n"14225" }\n"14226" else\n"14227" {\n"14228" context.fillStyle = \'grey\';\n"14229" context.fillText(SymbolStateString, X + 50, TextY);\n"14230" }\n"14231" SpinnerDraw(SymbolSpinnerActive, context, SpinnerLoadButton, X+2, Y, FontHeight, FontHeight );\n"14232"\n"14233"\n"14234"}\n"14235"\n"14236"function DrawMenuFunctions()\n"14237"{\n"14238" if(FilterInputValueLast != FilterInput.value)\n"14239" {\n"14240" nOffsetMenuFunctions = 0;\n"14241" var m = FilterInput.value.trim();\n"14242" if(m != \"\")\n"14243" {\n"14244" if(SymbolState && SymbolState.r == SymbolState.f)\n"14245" {\n"14246" var Req = ++FunctionQueryLastRequest;\n"14247" var Q = \"q\" + Req + \"x\" + m;\n"14248" WSSendMessage(Q);\n"14249" FunctionQueryPending = null;\n"14250" }\n"14251" else\n"14252" {\n"14253" FunctionQueryPending = m;\n"14254" if(SymbolState) //wtf?\n"14255" {\n"14256" LoadSymbolAnimRestart();\n"14257" }\n"14258" }\n"14259" }\n"14260" }\n"14261"\n"14262" FilterInputValueLast = FilterInput.value;\n"14263" var FF = FunctionQueryArray;\n"14264" var FilterArray = CreateFilter(FilterInput.value);\n"14265" var context = CanvasDetailedView.getContext(\'2d\');\n"14266" var nColorIndex = 0;\n"14267" var SizeInfo = TimerMenuSize(); //broken, fix\n"14268" SizeInfo.x = MenuItems[SubMenuFunctions].x;\n"14269" SizeInfo.y = MenuItems[SubMenuFunctions].y;\n"14270" var Y = SizeInfo.y;\n"14271" var Width = SizeInfo.w;\n"14272" Width = Math.max(300, Width);\n"14273" Width = 10+ MeasureArray(Width, FF, function(s){return s.n + \" \" + s.m;} );\n"14274"\n"14275" if(Width + SizeInfo.x + 50 > nWidth)\n"14276" {\n"14277" Width = nWidth - (SizeInfo.x+50);\n"14278" }\n"14279" SizeInfo.w = Width;\n"14280" var MaxStringLength = Math.floor(Width/(FontWidth));\n"14281"\n"14282" var Selection = null;\n"14283" var X = SizeInfo.x;\n"14284"\n"14285" {\n"14286" DrawSymbolHeaderMenu(context, X, Y, Width);\n"14287" }\n"14288"\n"14289"\n"14290" Y += BoxHeight;\n"14291" MoveFilterInputDiv(SizeInfo.x, Y, SizeInfo.w-6);\n"14292" Y += 45;\n"14293"\n"14294" let bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14295" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"14296" var TextY = Y+BoxHeight-FontAscent;\n"14297" var YClear = Y;\n"14298" var TextYClear = TextY;\n"14299" var bgcolorClear = bgcolor;\n"14300" var YStart = Y-BoxHeight*2;\n"14301"\n"14302" nColorIndex = 1-nColorIndex;\n"14303"\n"14304" Y -= nOffsetMenuFunctions + 10;\n"14305" var Selection = -1;\n"14306"\n"14307" var StringColor = function(Name)\n"14308" {\n"14309" var h = StringHash(Name);\n"14310" var cidx = h % 360;\n"14311" return cidx;\n"14312" };\n"14313"\n"14314" for(var i = 0; i < FF.length; ++i)\n"14315" {\n"14316" if(true)\n"14317" {\n"14318" var Name = FF[i].n;\n"14319" var ShortName = FF[i].sn;\n"14320" var Color = FF[i].c;\n"14321" var ColorModule = FF[i].cm;\n"14322" var ModuleName = FF[i].m;\n"14323" if(!Color || !ColorModule)\n"14324" {\n"14325" var cidx = StringColor(ShortName);\n"14326" FF[i].c = \"hsl(\" + cidx + \",50%, 70%)\";\n"14327" FF[i].rgb = ConvertHslToRGB(cidx/ 360, 0.5, 0.7);\n"14328" var cidxModule = StringColor(ModuleName);\n"14329" FF[i].cm = \"hsl(\" + cidxModule + \",50%, 70%)\";\n"14330" FF[i].rgbm = ConvertHslToRGB(cidxModule/ 360, 0.5, 0.7);\n"14331" Colo";1433214333const size_t g_MicroProfileHtmlLive_begin_3_size = sizeof(g_MicroProfileHtmlLive_begin_3);14334const char g_MicroProfileHtmlLive_begin_4[] =14335"r = FF[i].c;\n"14336" ColorModule = FF[i].cm;\n"14337" }\n"14338" var UseAlt = 0;\n"14339" var N = UseAlt ? Name : ShortName;\n"14340" if(N.length > MaxStringLength)\n"14341" {\n"14342" N = N.substring(N.length - MaxStringLength);\n"14343" }\n"14344" var E = false;\n"14345" if(true)\n"14346" {\n"14347"\n"14348" if(Y >= YStart)\n"14349" {\n"14350" bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14351" bgcolor = bMouseIn && MouseX > X ? nBackColorOffset : nBackColors[nColorIndex];\n"14352" TextY = Y+BoxHeight-FontAscent;\n"14353"\n"14354" context.fillStyle = bgcolor;\n"14355" context.fillRect(X, Y, Width, BoxHeight);\n"14356" context.fillStyle = Color;\n"14357" context.textAlign = \'right\';\n"14358" context.fillText(N, X + Width - 2, TextY);\n"14359" context.textAlign = \'left\';\n"14360" context.fillStyle = ColorModule;\n"14361" context.fillText(ModuleName, X, TextY);\n"14362" if(bMouseIn)\n"14363" {\n"14364" context.fillStyle = Color;\n"14365" var bgcolorin = bMouseIn && MouseX < X ? nBackColorOffset : nBackColors[nColorIndex];\n"14366"\n"14367" Selection = i;\n"14368" var W = context.measureText(\'>>\').width;\n"14369" W = Math.max(W, BoxHeight) + 2;\n"14370" var Corner = X - W - 1;\n"14371" if(Corner < SizeInfo.x)\n"14372" {\n"14373" SizeInfo.w += SizeInfo.x - Corner;\n"14374" SizeInfo.x = Corner;\n"14375" }\n"14376" context.fillStyle = bgcolorin;\n"14377" context.fillRect(Corner, Y, W, BoxHeight);\n"14378" context.fillStyle = Color;\n"14379" context.textAlign = \'center\';\n"14380" context.fillText(\">>\", Corner + Math.floor(W / 2), TextY);\n"14381"\n"14382" context.textAlign = \'left\';\n"14383" }\n"14384" }\n"14385" Y += BoxHeight;\n"14386" nColorIndex = 1-nColorIndex;\n"14387" }\n"14388" }\n"14389" }\n"14390"\n"14391" context.textAlign = \'left\';\n"14392" if(Selection != -1 && MouseReleased)\n"14393" {\n"14394" if(KeyShiftDown || MouseX < X)\n"14395" {\n"14396" let messageStart = \"I\" + FF[Selection].a + \' \' + FF[Selection].rgb;\n"14397" let messageEnd = FF[Selection].m + \'!\' + FF[Selection].n;\n"14398" let cb = function(result)\n"14399" {\n"14400" let size = parseInt(result[0]);\n"14401" if(isNaN(size))\n"14402" size = 0;\n"14403" let MaxFunctions = parseInt(result[1]);\n"14404" if(isNaN(MaxFunctions))\n"14405" MaxFunctions = 0;\n"14406" WSSendMessage(messageStart + \' \' + size + \' \' + MaxFunctions + \' \' + messageEnd);\n"14407" };\n"14408" let text = \"Instrument functions called by \" + messageEnd\n"14409" showPopup(text, [\n"14410" {label:\"Minimum function size(bytes)\", value:\"128\"},\n"14411" {label:\"Max functions to instrument\", value:\"0\"},\n"14412" ], cb);\n"14413" }\n"14414" else\n"14415" {\n"14416" WSSendMessage(\"i\" + FF[Selection].a + \' \' + FF[Selection].rgb + \' 0 0 \' + FF[Selection].m + \'!\' + FF[Selection].n);\n"14417" }\n"14418" }\n"14419" SizeInfo.h = Y-SizeInfo.y;\n"14420" return SizeInfo;\n"14421"}\n"14422"\n"14423"function DrawMenuGeneric(Elements, Active, OnClick, x, y, Elements2)\n"14424"{\n"14425" var context = CanvasDetailedView.getContext(\'2d\');\n"14426" var nColorIndex = 0;\n"14427" if(Elements2.length != Elements.length)\n"14428" {\n"14429" Elements2 = null;\n"14430" }\n"14431"\n"14432" var h = FontHeight * Elements.length;\n"14433" var w = 20;\n"14434" var w2 = 0;\n"14435" for(var i = 0; i < Elements.length; ++i)\n"14436" {\n"14437" var m = context.measureText(Elements[i]).width;\n"14438" w = w > m ? w : m;\n"14439" if(Elements2)\n"14440" {\n"14441" m = context.measureText(Elements2[i]).width;\n"14442" w2 = w2 > m ? w2 : m;\n"14443" }\n"14444" }\n"14445" w += 10 + w2;\n"14446" var SizeInfo = MenuSize(w);\n"14447" SizeInfo.x = x;\n"14448" SizeInfo.y = y;\n"14449" var X = x;\n"14450" var Y = y;\n"14451"\n"14452"\n"14453" for(var i = 0; i < Elements.length; ++i)\n"14454" {\n"14455" var Selected = Active == i;\n"14456" var Name = Elements[i];\n"14457" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14458" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"14459" var TextY = Y+BoxHeight-FontAscent;\n"14460" context.fillStyle = Selected?\'white\':bgcolor;\n"14461" context.fillRect(X-2, Y, w+4, BoxHeight);\n"14462" context.fillStyle = bgcolor;\n"14463" context.fillRect(X, Y, w, BoxHeight);\n"14464" context.fillStyle = \'white\';\n"14465" context.fillText(Name, X + 2, TextY);\n"14466" if(Elements2)\n"14467" {\n"14468" context.textAlign = \"right\";\n"14469" context.fillText(Elements2[i], X + w , TextY);\n"14470" context.textAlign = \"left\";\n"14471" }\n"14472" context.fillText(Name, X + 2, TextY);\n"14473" if(bMouseIn && MouseReleased)\n"14474" {\n"14475" OnClick(i, Name);\n"14476" }\n"14477" Y += BoxHeight;\n"14478" nColorIndex = 1-nColorIndex;\n"14479" }\n"14480" SizeInfo.h = Y - SizeInfo.y;\n"14481" return SizeInfo;\n"14482"}\n"14483"\n"14484"function DrawMenuGroup()\n"14485"{\n"14486" if(FilterInputValueLast != FilterInput.value)\n"14487" {\n"14488" nOffsetMenuGroup = 0;\n"14489" }\n"14490" FilterInputValueLast = FilterInput.value;\n"14491"\n"14492" var context = CanvasDetailedView.getContext(\'2d\');\n"14493" var nColorIndex = 0;\n"14494" var Selection = null;\n"14495" var SizeInfo = GroupMenuSize();\n"14496" SizeInfo.x = MenuItems[SubMenuGroup].x;\n"14497" SizeInfo.y = MenuItems[SubMenuGroup].y;\n"14498" var Y = SizeInfo.y;\n"14499" var X = SizeInfo.x;\n"14500" var Width = SizeInfo.w;\n"14501" var FilterArray = CreateFilter(FilterInput.value);\n"14502" MoveFilterInputDiv(SizeInfo.x-2, SizeInfo.y, SizeInfo.w-1);\n"14503" var YStart = Y+20;\n"14504" Y += 35;\n"14505" Y -= nOffsetMenuGroup;\n"14506"\n"14507"\n"14508" function DrawMenuElement(Selected, Name, color, Indent)\n"14509" {\n"14510" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14511" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"14512" context.fillStyle = Selected?\'white\':bgcolor;\n"14513" context.fillRect(X-2, Y, Width+4, BoxHeight);\n"14514" context.fillStyle = bgcolor;\n"14515" context.fillRect(X, Y, Width, BoxHeight);\n"14516" context.fillStyle = color;\n"14517" if(!Indent) Indent = 0;\n"14518" context.fillText(Name, X + Indent*FontWidth, Y+BoxHeight-FontAscent);\n"14519" nColorIndex = 1-nColorIndex;\n"14520" Y += BoxHeight;\n"14521" return bMouseIn;\n"14522" }\n"14523" function DrawMenuRecursive(Index, Indent, categorymatch)\n"14524" {\n"14525" ProfileEnter(\"DrawMenuRecursive\");\n"14526" var v = TimerArray[Index];\n"14527" if(v.idtype == TYPE_TIMER || v.idtype == TYPE_COUNTER)\n"14528" {\n"14529" return;\n"14530" }\n"14531" if(v.idtype == TYPE_GROUP && !categorymatch)\n"14532" {\n"14533" if(!FilterMatch(FilterArray, v.name))\n"14534" {\n"14535" return;\n"14536" }\n"14537" }\n"14538" var catmatch = 0;\n"14539" if(v.idtype == TYPE_CATEGORY)\n"14540" {\n"14541" if(FilterMatch(FilterArray, v.name))\n"14542" {\n"14543" catmatch = 1;\n"14544" }\n"14545" }\n"14546" var Closed = 0;\n"14547" if(Index > 0)\n"14548" {\n"14549" if(Y > YStart)\n"14550" {\n"14551" if(DrawMenuElement(v.e, v.name, v.color, Indent))\n"14552" {\n"14553" Selection = v.id;\n"14554" }\n"14555" }\n"14556" else\n"14557" {\n"14558" Y += BoxHeight;\n"14559" }\n"14560" }\n"14561"\n"14562" if(!Closed)\n"14563" {\n"14564" var ChildIndex = v.firstchild;\n"14565" while(ChildIndex != -1)\n"14566" {\n"14567" DrawMenuRecursive(ChildIndex, Indent + 1, catmatch);\n"14568" ChildIndex = TimerArray[ChildIndex].sibling;\n"14569" }\n"14570" }\n"14571" ProfileLeave();\n"14572" }\n"14573" DrawMenuRecursive(0, -1);\n"14574" if(Selection && MouseReleased)\n"14575" {\n"14576" WSSendMessage(\"c\" + Selection);\n"14577" }\n"14578" SizeInfo.h = Y - SizeInfo.y;\n"14579" return SizeInfo;\n"14580"}\n"14581"\n"14582"function DrawMenuCounters()\n"14583"{\n"14584" if(FilterInputValueLast != FilterInput.value)\n"14585" {\n"14586" nOffsetMenuCounters = 0;\n"14587" }\n"14588" FilterInputValueLast = FilterInput.value;\n"14589"\n"14590" var context = CanvasDetailedView.getContext(\'2d\');\n"14591" var nColorIndex = 0;\n"14592" var Selection = null;\n"14593" var SizeInfo = CounterMenuSize();\n"14594" SizeInfo.x = MenuItems[SubMenuCounters].x;\n"14595" SizeInfo.y = MenuItems[SubMenuCounters].y;\n"14596" var Y = SizeInfo.y;\n"14597" var X = SizeInfo.x;\n"14598" var Width = SizeInfo.w;\n"14599" var FilterArray = CreateFilter(FilterInput.value);\n"14600" MoveFilterInputDiv(SizeInfo.x-2, SizeInfo.y, SizeInfo.w-1);\n"14601" var YStart = Y+20;\n"14602" Y += 35;\n"14603" Y -= nOffsetMenuCounters;\n"14604"\n"14605"\n"14606" function DrawMenuElement(Selected, Name, color, Indent)\n"14607" {\n"14608" var bMouseIn = MouseY >= Y && MouseY < Y + BoxHeight;\n"14609" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"14610" context.fillStyle = Selected?\'white\':bgcolor;\n"14611" context.fillRect(X-2, Y, Width+4, BoxHeight);\n"14612" context.fillStyle = bgcolor;\n"14613" context.fillRect(X, Y, Width, BoxHeight);\n"14614" context.fillStyle = color;\n"14615" if(!Indent) Indent = 0;\n"14616" context.fillText(Name, X + Indent*FontWidth, Y+BoxHeight-FontAscent);\n"14617" nColorIndex = 1-nColorIndex;\n"14618" Y += BoxHeight;\n"14619" return bMouseIn;\n"14620" }\n"14621" function DrawMenuRecursive(Index, Indent, categorymatch)\n"14622" {\n"14623" ProfileEnter(\"DrawMenuRecursive\");\n"14624" var v = TimerArray[Index];\n"14625" if(v.idtype == TYPE_GROUP || v.idtype == TYPE_TIMER || v.idtype == TYPE_GROUP || v.idtype == TYPE_SETTING)\n"14626" {\n"14627" return;\n"14628" }\n"14629" \n"14630" if(v.sortkey)\n"14631" {\n"14632" if(!FilterMatch(FilterArray, v.sortkey))\n"14633" {\n"14634" return;\n"14635" }\n"14636" }\n"14637" var catmatch = 0;\n"14638" var Closed = 0;\n"14639" if(Index > 0)\n"14640" {\n"14641" if(Y > YStart)\n"14642" {\n"14643" if(DrawMenuElement(v.e, v.name, v.color, Indent*2))\n"14644" {\n"14645" Selection = v.id;\n"14646" }\n"14647" }\n"14648" else\n"14649" {\n"14650" Y += BoxHeight;\n"14651" }\n"14652" }\n"14653"\n"14654" if(!Closed)\n"14655" {\n"14656" var ChildIndex = v.firstchild;\n"14657" while(ChildIndex != -1)\n"14658" {\n"14659" DrawMenuRecursive(ChildIndex, Indent + 1, catmatch);\n"14660" ChildIndex = TimerArray[ChildIndex].sibling;\n"14661" }\n"14662" }\n"14663" ProfileLeave();\n"14664" }\n"14665" DrawMenuRecursive(0, -1);\n"14666" if(Selection && MouseReleased)\n"14667" {\n"14668" WSSendMessage(\"c\" + Selection);\n"14669" }\n"14670" SizeInfo.h = Y - SizeInfo.y;\n"14671" return SizeInfo;\n"14672"}\n"14673"\n"14674"\n"14675"function ShowMenu()\n"14676"{\n"14677" if(!Settings.ViewCompressed)\n"14678" return true;\n"14679" else\n"14680" {\n"14681" var Time = new Date();\n"14682" var Delta = Time - MouseMoveTime;\n"14683" console.log(\'delta time is \' + Delta);\n"14684" return Delta < 2000;\n"14685" }\n"14686"}\n"14687"\n"14688"function DrawMenu()\n"14689"{\n"14690" if(WSConnected && WS && WS.readyState == 1 && !Settings.ViewCompressed)\n"14691" {\n"14692" var context = CanvasDetailedView.getContext(\'2d\');\n"14693" var nColorIndex = 0;\n"14694" var Y = 50;\n"14695" var Width = 300;\n"14696" var Selection = null;\n"14697" if(!ShowMenu())\n"14698" {\n"14699" return;\n"14700" }\n"14701" ProfileEnter(\"DrawMenu\");\n"14702" DrawTopMenu();\n"14703" var MenuRect = WindowRect(0,0,nWidth,nHeight);\n"14704" if(SubMenuActive != -1)\n"14705" {\n"14706" MouseMoveTime = new Date();\n"14707" }\n"14708" if(SubMenuActive == SubMenuGroup)\n"14709" {\n"14710" MenuRect = DrawMenuGroup();\n"14711" }\n"14712" else if(SubMenuActive == SubMenuTimers)\n"14713" {\n"14714" MenuRect = DrawMenuTimer();\n"14715" }\n"14716" else if(SubMenuActive == SubMenuCounters)\n"14717" {\n"14718" MenuRect = DrawMenuCounters();\n"14719" }\n"14720" else if(SubMenuActive == SubMenuModules)\n"14721" {\n"14722" MenuRect = DrawMenuModules();\n"14723" }\n"14724" else if(SubMenuActive == SubMenuFunctions)\n"14725" {\n"14726" MenuRect = DrawMenuFunctions();\n"14727" }\n"14728" else if(SubMenuActive == SubMenuPatched)\n"14729" {\n"14730" MenuRect = DrawMenuPatched();\n"14731" }\n"14732" else if(SubMenuActive == SubMenuSettings)\n"14733" {\n"14734" MenuRect = DrawMenuSettings();\n"14735" }\n"14736" else if(SubMenuActive == SubMenuViews)\n"14737" {\n"14738" MenuRect = DrawMenuViews();\n"14739" }\n"14740" else if(SubMenuActive == SubMenuPresets)\n"14741" {\n"14742" MenuRect = DrawMenuPresets();\n"14743" }\n"14744" else if(SubMenuActive == SubMenuColumns)\n"14745" {\n"14746" MenuRect = DrawMenuColumns();\n"14747" }\n"14748" else if(SubMenuActive == SubMenuCapture)\n"14749" {\n"14750" MenuRect = DrawMenuCapture();\n"14751" }\n"14752" else if(SubMenuActive == SubMenuGraphSettings)\n"14753" {\n"14754" MenuRect = DrawMenuGraphSettings();\n"14755" }\n"14756" var Grow = 10;\n"14757" MenuRect.x -= Grow;\n"14758" MenuRect.y -= Grow;\n"14759" MenuRect.h += 2*Grow;\n"14760" MenuRect.w += 2*Grow;\n"14761" var MouseMoved = MouseX != SubMenuMouseX || MouseY != SubMenuMouseY;\n"14762"\n"14763" if(MouseInRect(MenuRect) || !MouseMoved)\n"14764" {\n"14765" SubMenuTimeout = new Date();\n"14766" SubMenuMouseX = MouseX;\n"14767" SubMenuMouseY = MouseY;\n"14768" }\n"14769" else\n"14770" {\n"14771" var Time = new Date() - SubMenuTimeout;\n"14772" var Dest = SubMenuTimeoutBase * 1000;\n"14773" if(Time > Dest)\n"14774" {\n"14775" EnableMenu(-1);\n"14776" }\n"14777" }\n"14778" if(0)//debugging of menu extents. dont delete\n"14779" {\n"14780" context.strokeStyle = \'red\';\n"14781" context.beginPath();\n"14782" context.moveTo(MenuRect.x,MenuRect.y);\n"14783" context.lineTo(MenuRect.x + MenuRect.w,MenuRect.y);\n"14784" context.lineTo(MenuRect.x + MenuRect.w,MenuRect.y+MenuRect.h);\n"14785" context.lineTo(MenuRect.x,MenuRect.y+MenuRect.h);\n"14786" context.lineTo(MenuRect.x,MenuRect.y);\n"14787" context.stroke();\n"14788" }\n"14789" SpinnerDraw(SpinnerShow(), context, SpinnerCorner, 0, nHeight-20, 20, 20);\n"14790" ProfileLeave();\n"14791" }\n"14792"}\n"14793"\n"14794"function DrawConnectionStatus()\n"14795"{\n"14796" if(WSConnected && WS && WS.readyState == 1)\n"14797" {\n"14798" if(!ProfileMode)\n"14799" return;\n"14800" }\n"14801" var Strings = new Array();\n"14802" Strings.push(\"Status\");\n"14803" if(WSConnected && WS && WS.readyState == 1)\n"14804" {\n"14805" Strings.push(\"[X]\");\n"14806" }\n"14807" else\n"14808" {\n"14809" ConnectionIdx = (ConnectionIdx + 1 ) % ConnectionStr.length;\n"14810" Strings.push(\"[\" + ConnectionStr[ConnectionIdx]+\"]\");\n"14811" }\n"14812" Strings.push(\"Port\");\n"14813" Strings.push(\"\" + WSPort);\n"14814" Strings.push(\"Path\");\n"14815" Strings.push(\"\" + WSPath);\n"14816" Strings.push(\"Sends\");\n"14817" Strings.push(\"\" + WSSend);\n"14818" Strings.push(\"Receives\");\n"14819" Strings.push(\"\" + WSReceive);\n"14820" Strings.push(\"SendBytes\");\n"14821" Strings.push(\"\" + WSSendBytes);\n"14822" Strings.push(\"ReceiveBytes\");\n"14823" Strings.push(\"\" + WSReceiveBytes);\n"14824" Strings.push(\"Seconds\");\n"14825" Strings.push(\"\" + WSSeconds);\n"14826" DrawToolTip(Strings, CanvasDetailedView, 50000, 0);\n"14827"}\n"14828"function DrawActiveToolTip()\n"14829"{\n"14830" if(SubMenuActive == -1)\n"14831" {\n"14832" if(ToolTipCallback && SubMenuActive == -1)\n"14833" {\n"14834" var Strings = ToolTipCallback(CanvasDetailedView, MouseX, MouseY);\n"14835" if(Strings)\n"14836" {\n"14837" DrawToolTip(Strings, CanvasDetailedView, MouseX, MouseY);\n"14838" }\n"14839" }\n"14840" }\n"14841" ToolTipCallback = null;\n"14842"}\n"14843"function UpdateSettings()\n"14844"{\n"14845" if(Settings.AutomaticReference)\n"14846" {\n"14847" if( Math.abs(ReferenceGraph - ReferenceGraphAutomatic) > 0.02 ||\n"14848" Math.abs(ReferenceHistory - ReferenceHistoryAutomatic) > 0.02)\n"14849" {\n"14850" RequestDraw();\n"14851" }\n"14852" ReferenceGraph = 0.9 * ReferenceGraph + 0.1 * ReferenceGraphAutomatic;\n"14853" ReferenceHistory = 0.9 * ReferenceHistory + 0.1 * ReferenceHistoryAutomatic;\n"14854" ReferenceBar = 0.9 * ReferenceBar + 0.1 * ReferenceBarAutomatic;\n"14855" var TimerMap = FrameData.TimerMap;\n"14856" if(!TimerMap)\n"14857" return;\n"14858"\n"14859"\n"14860" for(var key in TimerMap)\n"14861" {\n"14862" var TimerState = TimerMap[key];\n"14863" if(!TimerState.historymaxsoft)\n"14864" {\n"14865" TimerState.historymaxsoft = TimerState.historymax;\n"14866" }\n"14867" else\n"14868" {\n"14869" TimerState.historymaxsoft = 0.9 * TimerState.historymaxsoft + 0.1 * TimerState.historymax;\n"14870" }\n"14871" }\n"14872"\n"14873" }\n"14874" else\n"14875" {\n"14876" ReferenceGraph = Settings.ReferenceTime;\n"14877" ReferenceHistory = Settings.ReferenceTime;\n"14878" ReferenceBar = Settings.ReferenceTime;\n"14879" }\n"14880" if(Settings.AggregateFrames != AggregateFrames)\n"14881" {\n"14882" WSSendMessage(\"a\" + Settings.AggregateFrames);\n"14883" AggregateFrames = Settings.AggregateFrames;\n"14884" }\n"14885"}\n"14886"\n"14887"var PendingDraw = 0;\n"14888"\n"14889"function Draw()\n"14890"{\n"14891" CaptureUpdate();\n"14892" PendingDraw = 0;\n"14893" ProfileEnter(\"Total\");\n"14894"\n"14895" UpdateSettings();\n"14896"\n"14897" if(WSConnected && WS && WS.readyState == 1)\n"14898" {\n"14899" DrawViews();\n"14900" DrawMessage();\n"14901" DrawMenu();\n"14902" }\n"14903" else\n"14904" {\n"14905" var context = CanvasDetailedView.getContext(\'2d\');\n"14906" context.clearRect(0, 0, nWidth, nHeight);\n"14907" DrawMessage();\n"14908" }\n"14909"\n"14910" DrawConnectionStatus();\n"14911" DrawPlotf(CanvasDetailedView);\n"14912" DrawActiveToolTip();\n"14913"\n"14914"\n"14915" ProfileLeave();\n"14916" ProfileModeDraw(CanvasDetailedView);\n"14917" ProfileModeClear();\n"14918"\n"14919"\n"14920" PlotfClear();\n"14921"\n"14922" MouseReleased = false;\n"14923"}\n"14924"function RequestDraw()\n"14925"{\n"14926" if(!PendingDraw)\n"14927" {\n"14928" PendingDraw = 1;\n"14929" requestAnimationFrame(Draw);\n"14930" }\n"14931"}\n"14932"\n"14933"\n"14934"\n"14935"\n"14936"function WSOpen(event)\n"14937"{\n"14938" SetMessage(\"Connected!\", 1000);\n"14939" WSSend = 0;\n"14940" WSReceive = 0;\n"14941" WSSendBytes = 0;\n"14942" WSReceiveBytes = 0;\n"14943" WSIsOpen = 1;\n"14944"\n"14945" Empty = {\"id\":0, \"w\":0, \"depth\":0, \"sibling\":-1,\"parent\":-1,\"firstchild\":-1};\n"14946" TimerArray = [];\n"14947" TimerArray.push(Empty);\n"14948" WidthArray = [];\n"14949" CounterArray = [];\n"14950" WidthArray[TYPE_NONE] = 0;\n"14951" WidthArray[TYPE_TIMER] = 0;\n"14952" WidthArray[TYPE_GROUP] = 0;\n"14953" WidthArray[TYPE_CATEGORY] = 0;\n"14954" WidthArray[TYPE_COUNTER] = 0;\n"14955" WidthTree = FontWidth;\n"14956" SymbolState = null;\n"14957" FunctionQueryPending = 0;\n"14958" FunctionQueryReceived = 0;\n"14959" FunctionQueryLastRequest = 0;\n"14960" FunctionsInstrumented = [];\n"14961" FunctionsInstrumentedModule = [];\n"14962" FunctionsInstrumentedUnmangled = [];\n"14963"\n"14964" FilterInputTimersValue = \"\";\n"14965" FilterInputGroupsValue = \"\";\n"14966" FilterInputFunctionsValue = \"\";\n"14967" FilterInput.value = \"\";\n"14968" FunctionQueryArray = [];\n"14969" ModuleState = [];\n"14970"\n"14971" ResetFrameData();\n"14972" window.document.title = \"MP:\" + WSHost;\n"14973"\n"14974" if(PresetToLoad && PresetToLoad != \"\")\n"14975" {\n"14976" LoadPreset(PresetToLoad, PresetToLoadRO);\n"14977" }\n"14978" ViewCompressedTimeout = 5000.0;\n"14979"}\n"14980"\n"14981"function SplitIdTop(v)\n"14982"{\n"14983" return v >> 24; // todo: verify\n"14984"}\n"14985"\n"14986"function SplitIdBottom(v)\n"14987"{\n"14988" return v & 0xffffff; // todo: verify\n"14989"}\n"14990"\n"14991"function GetTimer(id)\n"14992"{\n"14993" for(var i = 0; i < TimerArray.length; ++i)\n"14994" {\n"14995" if(TimerArray[i].id == id)\n"14996" {\n"14997" return i;\n"14998" }\n"14999" }\n"15000" return null;\n"15001"}\n"15002"function GetTimerFromFullName(Name)\n"15003"{\n"15004" for(let i = 0; i < TimerArray.length; ++i)\n"15005" {\n"15006" if(GetFullName(TimerArray[i]) == Name)\n"15007" {\n"15008" return i;\n"15009" }\n"15010" }\n"15011" return null;\n"15012"}\n"15013"\n"15014"\n"15015"function InitCounterName(T)\n"15016"{\n"15017" if(T.countername)\n"15018" return T.countername;\n"15019" let name = \"/\" + T.name;\n"15020" if(T.parent)\n"15021" name = InitCounterName(TimerArray[T.parent]) + name;\n"15022" T.countername = name;\n"15023" return name;\n"15024"}\n"15025"\n"15026"\n"15027"\n"15028"function IsGroup(id)\n"15029"{\n"15030" var idx = GetTimer(id);\n"15031" return TimerArray[idx].idtype == TYPE_GROUP;\n"15032"}\n"15033"\n"15034"function UpdateActive()\n"15035"{\n"15036" GroupsEnabled = 0;\n"15037" TimersEnabled = 0;\n"15038" CountersEnabled = 0;\n"15039" for(var i = 0; i < TimerArray.length; ++i)\n"15040" {\n"15041" var T = TimerArray[i];\n"15042" if(T.e)\n"15043" {\n"15044" switch(T.idtype)\n"15045" {\n"15046" case TYPE_GROUP:\n"15047" GroupsEnabled++;\n"15048" break;\n"15049" case TYPE_TIMER:\n"15050" TimersEnabled++;\n"15051" case TYPE_COUNTER:\n"15052" TimersEnabled++;\n"15053" break;\n"15054" }\n"15055" }\n"15056" }\n"15057"}\n"15058"function UpdateEnabledTimer(idx)\n"15059"{\n"15060" UpdateActive();\n"15061" var type = TimerArray[idx].idtype;\n"15062" var enabled = TimerArray[idx].e;\n"15063" if(TimerArray[idx].idtype != TYPE_TIMER)\n"15064" {\n"15065" return;\n"15066" }\n"15067" var AutoCaptureSourceValue = null;\n"15068" if(AutoCaptureSourceIndex >= 0 && AutoCaptureSourceIndex < EnabledArray.length)\n"15069" {\n"15070" AutoCaptureSourceValue = EnabledArray[AutoCaptureSourceIndex];\n"15071" }\n"15072"\n"15073" var i = EnabledArray.indexOf(idx);\n"15074" if(enabled)\n"15075" {\n"15076" if(i == -1)\n"15077" {\n"15078" EnabledArray.unshift(idx);\n"15079" }\n"15080" }\n"15081" else\n"15082" {\n"15083" if(i != -1)\n"15084" {\n"15085" EnabledArray.splice(i, 1);\n"15086" }\n"15087" }\n"15088" var NewIndex = AutoCaptureSourceValue != null ? EnabledArray.indexOf(AutoCaptureSourceValue) : -1;\n"15089" AutoCaptureSourceIndex = NewIndex;\n"15090"}\n"15091"\n"15092"function EnableTimer(T)\n"15093"{\n"15094" let idx = GetTimer(T.id);\n"15095" if(idx != null && idx >= 0)\n"15096" {\n"15097" TimerArray[idx].e = T.e;\n"15098" UpdateEnabledTimer(idx);\n"15099" }\n"15100" else\n"15101" {\n"15102" console.log(\'EnableTimer: unknown enable message\');\n"15103" }\n"15104"}\n"15105"\n"15106"function MeasureWidth(str)\n"15107"{\n"15108" let context = CanvasDetailedView.getContext(\'2d\');\n"15109" context.font = Font;\n"15110" return context.measureText(str).width;\n"15111"}\n"15112"function AddTimer(T)\n"15113"{\n"15114" if(!T.color || T.color == \"\")\n"15115" {\n"15116" T.color = ColorFromString(T.name, 40, 50);\n"15117" }\n"15118" console.log(\"Added timer\", T.name);\n"15119" let idx = TimerArray.length;\n"15120" let existing = GetTimer(T.id);\n"15121" let Parent;\n"15122" if(existing)\n"15123" {\n"15124" idx = existing;\n"15125" }\n"15126" else\n"15127" {\n"15128" TimerArray[idx] = T;\n"15129" }\n"15130" TimerArray[idx].time = 0;\n"15131" TimerArray[idx].excl = 0;\n"15132" TimerArray[idx].average = 0;\n"15133" TimerArray[idx].max = 0;\n"15134" TimerArray[idx].min = 0;\n"15135" TimerArray[idx].total = 0;\n"15136" TimerArray[idx].exclaverage = 0;\n"15137" TimerArray[idx].exclmax = 0;\n"15138" TimerArray[idx].excltotal = 0;\n"15139" TimerArray[idx].spike = 0;\n"15140" TimerArray[idx].callaverage = 0;\n"15141" TimerArray[idx].callexclaverage = 0;\n"15142" TimerArray[idx].callcount = 0;\n"15143" let w = MeasureWidth(T.name);\n"15144" let idtype = SplitIdTop(T.id);\n"15145" let idelement = SplitIdBottom(T.id);\n"15146" TimerArray[idx].idtype = idtype;\n"15147" TimerArray[idx].idelement = idelement;\n"15148" TimerArray[idx].w = w;\n"15149" TimerArray[idx].wtree = w;\n"15150" TimerArray[idx].timertype = T.type;\n"15151" if(!existing)\n"15152" {\n"15153" TimerArray[idx].sibling = -1;\n"15154" TimerArray[idx].parent = -1;\n"15155" TimerArray[idx].firstchild = -1;\n"15156" }\n"15157" if(w > WidthArray[idtype])\n"15158" {\n"15159" WidthArray[idtype] = w;\n"15160" }\n"15161" UpdateEnabledTimer(idx);\n"15162" let wparent = 0;\n"15163" let pidx = GetTimer(T.pid);\n"15164" if(pidx >= 0 && !existing)\n"15165" {\n"15166" TimerArray[idx].parent = pidx;\n"15167" Parent = TimerArray[pidx];\n"15168" let Sibling = Parent.firstchild;\n"15169" wparent = MeasureWidth(Parent.name);\n"15170" Parent.firstchild = idx;\n"15171" if(Sibling != -1)\n"15172" {\n"15173" if(TimerArray[Sibling].sibling == idx)\n"15174" {\n"15175" debugger;\n"15176" }\n"15177" }\n"15178" TimerArray[idx].sibling = Sibling;\n"15179" TimerArray[idx].wtree += Parent.depth * FontWidth;\n"15180" TimerArray[idx].depth = Parent.depth + 1;\n"15181" if(TimerArray[idx].wtree > WidthTree)\n"15182" {\n"15183" WidthTree = TimerArray[idx].wtree;\n"15184" }\n"15185" TimerArray[idx].sortkey = Parent.name + \" __ \" + T.name;\n"15186" }\n"15187" else\n"15188" {\n"15189" TimerArray[idx].sortkey = T.name;\n"15190" }\n"15191" TimerArray[idx].wparent = wparent;\n"15192" TimerArray[idx].wtotal = wparent + w;\n"15193"\n"15194" if(idtype == TYPE_COUNTER)\n"15195" {\n"15196" if(idelement != CounterArray.length)\n"15197" {\n"15198" debugger;\n"15199" }\n"15200" InitCounterName(TimerArray[idx]);\n"15201" let w = MeasureWidth(T.countername);\n"15202" if(w > WidthArray[idtype])\n"15203" {\n"15204" WidthArray[idtype] = w;\n"15205" }\n"15206"\n"15207"\n"15208" CounterArray.push(idx);\n"15209" TimerArray[idx].formattedlimit = FormatCounter(TimerArray[idx].format, TimerArray[idx].limit);\n"15210" CounterLimitWidth = Math.max(CounterLimitWidth, TimerArray[idx].formattedlimit.length * (FontWidth+1));\n"15211" CounterNameWidth = Math.max(CounterNameWidth, (TimerArray[idx].name.length + 1 + TimerArray[idx].depth) * (FontWidth+1));\n"15212" CounterNameMenuWidth = Math.max(CounterNameMenuWidth, (TimerArray[idx].name.length + 1 + (2*TimerArray[idx].depth)) * (FontWidth));\n"15213" CounterFullNameWidth = Math.max(CounterFullNameWidth, (TimerArray[idx].countername.length + 1) * (FontWidth));\n"15214" TimerArray[idx].counterhistory = {};\n"15215" TimerArray[idx].counterhistory.history = AllocClearedArray(120);\n"15216" TimerArray[idx].counterhistory.prc = AllocClearedArray(120);\n"15217" }\n"15218" if(idtype == TYPE_TIMER)\n"15219" {\n"15220" if(T.color == \"#000000\")\n"15221" {\n"15222" T.color = ColorFromString(T.name + \"x\" + Parent.name, 40, 50);\n"15223" }\n"15224"\n"15225" }\n"15226" RequestDraw();\n"15227"}\n"15228"\n"15229"function AllocClearedArray(Size)\n"15230"{\n"15231" let A = new Array(Size);\n"15232" for(let i = 0; i < Size; ++i)\n"15233" {\n"15234" A[i] = 0;\n"15235" }\n"15236" return A;\n"15237"}\n"15238"function PushIntoArray(A, v)\n"15239"{\n"15240" A.shift();\n"15241" A.push(v);\n"15242"}\n"15243"function ResetFrameData()\n"15244"{\n"15245" FrameData = {};\n"15246" FrameData.TimerMap = {};\n"15247" FrameData.Time = AllocClearedArray(FRAME_COUNT);\n"15248" FrameData.TimeSoft = AllocClearedArray(FRAME_COUNT);\n"15249" FrameData.Ids = AllocClearedArray(FRAME_COUNT);\n"15250" FrameData.Frozen = AllocClearedArray(FRAME_COUNT);\n"15251" FrameData.ThreadTime = {};\n"15252"}\n"15253"function GetFrameData(id)\n"15254"{\n"15255" if(FrameData.TimerMap[id])\n"15256" {\n"15257" return FrameData.TimerMap[id];\n"15258" }\n"15259" else\n"15260" {\n"15261" var FD = {};\n"15262" FD.Count = AllocClearedArray(FRAME_COUNT);\n"15263" FD.Time = AllocClearedArray(FRAME_COUNT);\n"15264" FD.TimeSoft = AllocClearedArray(FRAME_COUNT);\n"15265" FD.TimeExcl = AllocClearedArray(FRAME_COUNT);\n"15266" FD.TimeMax = AllocClearedArray(AggregateHistorySize);\n"15267" FD.TimeMin = AllocClearedArray(AggregateHistorySize);\n"15268" FD.TimeAvg = AllocClearedArray(AggregateHistorySize);\n"15269" FD.TimeExclMax = AllocClearedArray(AggregateHistorySize);\n"15270" FD.TimeExclMin = AllocClearedArray(AggregateHistorySize);\n"15271" FD.TimeExclAvg = AllocClearedArray(AggregateHistorySize);\n"15272" FD.TimeCallAvg = AllocClearedArray(AggregateHistorySize);\n"15273" FD.TimeCallExclAvg = AllocClearedArray(AggregateHistorySize);\n"15274" FD.TimeTotal = AllocClearedArray(AggregateHistorySize);\n"15275" FD.TimeExclTotal = AllocClearedArray(AggregateHistorySize);\n"15276" FD.CallCount = AllocClearedArray(AggregateHistorySize);\n"15277" FD.Percentile = new Float32Array(PERCENTILE_SAMPLES);\n"15278" FD.Percentile.fill(0.0);\n"15279" FD.PercentileMax = -1e38;\n"15280" FD.PercentileMin = 1e38;\n"15281" FD.PercentileCount = 0;\n"15282" FD.EmptyFrames = 0;\n"15283"\n"15284"\n"15285" FD.AggregateFrames = 0;\n"15286" FD.FrameTime = 0.0;\n"15287" FD.Aggregate = 0;\n"15288" FD.AggregateTime = 0.0;\n"15289" FD.AggregateSum = 0;\n"15290" FD.AggregateMax = 0;\n"15291" FD.AggregateMin = C_HUGE;\n"15292" FD.AggregateExclSum = 0;\n"15293" FD.AggregateExclMax = 0;\n"15294" FD.AggregateCount = 0;\n"15295" FD.AggregateExclMin = C_HUGE;\n"15296"\n"15297"\n"15298"\n"15299" FrameData.TimerMap[id] = FD;\n"15300" return FD;\n"15301" }\n"15302"}\n"15303"\n"15304"function ProcessCounters(C)\n"15305"{\n"15306" for(var i = 0; i < CounterArray.length; ++i)\n"15307" {\n"15308" if(i > C.length)\n"15309" {\n"15310" debugger;\n"15311" }\n"15312" var idx = CounterArray[i];\n"15313" var value = C[i];\n"15314" var T = TimerArray[idx];\n"15315" T.value = value;\n"15316" if(T.minvalue == undefined)\n"15317" T.minvalue = value;\n"15318" else\n"15319" T.minvalue = Math.min(T.minvalue, value);\n"15320" if(T.maxvalue == undefined)\n"15321" T.maxvalue = value;\n"15322" else\n"15323" T.maxvalue = Math.max(T.maxvalue, value);\n"15324" T.formatted = FormatCounter(T.format, value);\n"15325" var boxprc = 1.0;\n"15326" var counterprc = 0;\n"15327" if(T.limit)\n"15328" {\n"15329" counterprc = value / T.limit;\n"15330" if(counterprc > 1.0)\n"15331" {\n"15332" boxprc = 1.0 / counterprc;\n"15333" counterprc = 1.0;\n"15334" }\n"15335" counterprc = Math.max(counterprc, 0.0);\n"15336"\n"15337" }\n"15338" T.boxprc = boxprc;\n"15339" T.counterprc = counterprc;\n"15340" PushIntoArray(T.counterhistory.history, value);\n"15341" var prc = T.maxvalue > T.minvalue ? (value - T.minvalue) / (T.maxvalue - T.minvalue) : 0.0;\n"15342" PushIntoArray(T.counterhistory.prc, prc);\n"15343" CounterValueWidth = Math.max(CounterValueWidth, T.formatted.length * (FontWidth+1));\n"15344" }\n"15345"\n"15346"}\n"15347"\n"15348"\n"15349"function ProcessFrame(F, Inactive)\n"15350"{\n"15351" ProfileEnter(\"ProcessFrame\");\n"15352" if(F.s)\n"15353" {\n"15354" if(F.s.l == F.s.r)\n"15355" {\n"15356" if(FunctionQueryPending)\n"15357" {\n"15358" var Req = ++FunctionQueryLastRequest;\n"15359" var Q = \"q\" + Req + \"x\" + FunctionQueryPending;\n"15360" WSSendMessage(Q);\n"15361" FunctionQueryPending = null;\n"15362" }\n"15363" }\n"15364" SymbolState = F.s;\n"15365" if(F.M)\n"15366" {\n"15367" ModuleState = F.M;\n"15368" }\n"15369" MenuItems[SubMenuFunctions].visible = function(){return true;};\n"15370" MenuItems[SubMenuModules].visible = function(){return true;};\n"15371" }\n"15372" else\n"15373" {\n"15374" MenuItems[SubMenuFunctions].visible = function(){return false;};\n"15375" MenuItems[SubMenuModules].visible = function(){return false;};\n"15376" }\n"15377" if(F.fr)\n"15378" {\n"15379" IsFrozen = 10;//allow it to stabilize after freezing\n"15380" ProfileLeave();\n"15381" return;\n"15382" }\n"15383" if(IsFrozen)\n"15384" {\n"15385" IsFrozen--;\n"15386" }\n"15387" if(!Inactive)\n"15388" {\n"15389" var TriggerAutoCapture = 0;\n"15390" PushIntoArray(FrameData.Time, F.t);\n"15391" PushIntoArray(FrameData.Ids, F.f);\n"15392" PushIntoArray(FrameData.Frozen, IsFrozen ? 1 : 0);\n"15393" var CaptureId = null;\n"15394" var AutoCapture = AutoCaptureEnabled && !IsFrozen;\n"15395" AggregateCurrent = F.a;\n"15396" if(F.m != Settings.ViewActive)\n"15397" {\n"15398" WSSendMessage(\"v\" + Settings.ViewActive);\n"15399" }\n"15400" if(AutoCapture > 0 && null == CaptureTriggerTime && AutoCaptureCooldown < 0)\n"15401" {\n"15402" if(AutoCaptureSourceIndex == -1 && F.t > Settings.AutoCaptureTheshold)\n"15403" {\n"15404" AutoCaptureEnabled -= 1;\n"15405" TriggerAutoCapture = 1;\n"15406" }\n"15407" else if(AutoCaptureSourceIndex >= 0 && AutoCaptureSourceIndex < EnabledArray.length)\n"15408" {\n"15409" var id = TimerArray[EnabledArray[AutoCaptureSourceIndex]].id;\n"15410" var Data = F.x[id];\n"15411" if(Data && Data[0])\n"15412" {\n"15413" if(Data[0] > Settings.AutoCaptureTheshold)\n"15414" {\n"15415" TriggerAutoCapture = 1;\n"15416" AutoCaptureEnabled -= 1;\n"15417" console.log(\'trigger capture! \', Data[0], \' \', Settings.AutoCaptureTheshold);\n"15418" }\n"15419" }\n"15420" }\n"15421" }\n"15422" AutoCaptureCooldown = AutoCaptureCooldown - 1;\n"15423"\n"15424" var GraphTimeMax = 0;\n"15425" var GraphTimeGroupMax = 0;\n"15426" var HistoryTimeMax = 0;\n"15427"\n"15428" for(var i = 0; i < FrameData.Time.length; ++i)\n"15429" {\n"15430" if(0 == FrameData.Frozen[i])\n"15431" {\n"15432" HistoryTimeMax = HistoryTimeMax > FrameData.Time[i] ? HistoryTimeMax : FrameData.Time[i];\n"15433" }\n"15434" }\n"15435" var FindMaxTime = function(A, bIsGroup)\n"15436" {\n"15437" var MaxTime = 0;\n"15438" for(var i = 0; i < A.length; ++i)\n"15439" {\n"15440" if(0 == FrameData.Frozen[i])\n"15441" {\n"15442" MaxTime = MaxTime > A[i] ? MaxTime : A[i];\n"15443" }\n"15444" }\n"15445" if(bIsGroup)\n"15446" GraphTimeGroupMax = MaxTime > GraphTimeGroupMax ? MaxTime : GraphTimeGroupMax;\n"15447" else\n"15448" GraphTimeMax = MaxTime > GraphTimeMax ? MaxTime : GraphTimeMax;\n"15449" return MaxTime;\n"15450" };\n"15451" function SetAggregateTimersInArray(FD, id)\n"15452" {\n"15453" var idx = GetTimer(id);\n"15454" var Pos = AggregateHistorySize-1;\n"15455" var T = TimerArray[idx];\n"15456"\n"15457" T.max = FD.TimeMax[Pos];\n"15458" T.total = FD.TimeTotal[Pos];\n"15459" T.excltotal = FD.TimeExclTotal[Pos];\n"15460" T.min = FD.TimeMin[Pos];\n"15461" T.spike = (T.average == 0 || T.max == 0) ? 0 : (100*T.max/T.average);\n"15462" T.callaverage = FD.TimeCallAvg[Pos];\n"15463" T.callcount = FD.CallCount[Pos];\n"15464" T.callexclaverage = FD.TimeCallExclAvg[Pos];\n"15465" T.exclaverage = FD.TimeExclAvg[Pos];\n"15466" T.exclmax = FD.TimeExclMax[Pos];\n"15467" T.exclmin = FD.TimeExclMin[Pos];\n"15468" T.average = FD.TimeAvg[Pos];\n"15469" };\n"15470" function SetTimersInArray(FD, id)\n"15471" {\n"15472" var idx = GetTimer(id);\n"15473" var Pos = FD.Time.length-1;\n"15474" var T = TimerArray[idx];\n"15475" T.time = FD.Time[Pos];\n"15476" T.excl = FD.TimeExcl[Pos];\n"15477" T.count = FD.Count[Pos];\n"15478"\n"15479" };\n"15480"\n"15481" let UpdateFrameDataInternal = function(id, Time, TimeExcl, Count, bIsGroup)\n"15482" {\n"15483"\n"15484" let FD = GetFrameData(id);\n"15485" if(!IsFrozen)\n"15486" {\n"15487" ProfileEnter(\"PercentileAccum\");\n"15488" FD.PercentileMax = Math.max(FD.PercentileMax, Time);\n"15489" FD.PercentileMin = Math.min(FD.PercentileMin, Time);\n"15490" FD.PercentileCount += 1;\n"15491" if(Time > FD.Percentile[0])\n"15492" {\n"15493" FD.Percentile[0] = Time;\n"15494" FD.Percentile.sort( function(a,b){return a - b;} );\n"15495" }\n"15496" ProfileLeave();\n"15497" }\n"15498" PushIntoArray(FD.Time, Time);\n"15499" let beg = Math.max(0, FD.Time.length - Settings.GraphSoftFrames);\n"15500" let end = FD.Time.length-1;\n"15501" let mod = Settings.GraphSoftMode;\n"15502" let soft = 0.0;\n"15503" if(mod == 1)\n"15504" {\n"15505" for(let i = beg; i < end; ++i)\n"15506" soft += FD.Time[i];\n"15507" if(beg != end)\n"15508" soft /= (end-beg);\n"15509" }\n"15510" else if(mod == 2)\n"15511" {\n"15512" soft = 1e38;\n"15513" for(let i = beg; i < end; ++i)\n"15514" soft = Math.min(FD.Time[i], soft);\n"15515" }\n"15516" else if(mod == 3)\n"15517" {\n"15518" for(let i = beg; i < end; ++i)\n"15519" soft = Math.max(FD.Time[i], soft);\n"15520" }\n"15521" PushIntoArray(FD.TimeSoft, soft);\n"15522" PushIntoArray(FD.TimeExcl, TimeExcl);\n"15523" PushIntoArray(FD.Count, Count);\n"15524" FD.historymax = FindMaxTime(FD.Time, bIsGroup);\n"15525"\n"15526" if((FD.Aggregate > Settings.AggregateFrames && Settings.AggregateFrames > 0) || AggregateCurrent == 0)\n"15527" {\n"15528" SetAggregateTimersInArray(FD, id);\n"15529" FD.Aggregate = 0;\n"15530" FD.AggregateSum = 0;\n"15531" FD.AggregateMax = 0;\n"15532" FD.AggregateMin = C_HUGE;\n"15533" FD.AggregateExclSum = 0;\n"15534" FD.AggregateExclMax = 0;\n"15535" FD.AggregateExclMin = C_HUGE;\n"15536" FD.AggregateCount = 0;\n"15537"\n"15538" FD.TimeMax.shift();\n"15539" FD.TimeMax.push(0);\n"15540"\n"15541" FD.TimeMin.shift();\n"15542" FD.TimeMin.push(0);\n"15543"\n"15544" FD.TimeAvg.shift();\n"15545" FD.TimeAvg.push(0);\n"15546"\n"15547" FD.TimeCallAvg.shift();\n"15548" FD.TimeCallAvg.push(0);\n"15549"\n"15550" FD.TimeCallExclAvg.shift();\n"15551" FD.TimeCallExclAvg.push(0);\n"15552"\n"15553" FD.CallCount.shift();\n"15554" FD.CallCount.push(0);\n"15555"\n"15556" FD.TimeTotal.shift();\n"15557" FD.TimeTotal.push(0);\n"15558"\n"15559" FD.TimeExclTotal.shift();\n"15560" FD.TimeExclTotal.push(0);\n"15561"\n"15562" FD.TimeExclMax.shift();\n"15563" FD.TimeExclMax.push(0);\n"15564"\n"15565" FD.TimeExclMin.shift();\n"15566" FD.TimeExclMin.push(0);\n"15567"\n"15568" FD.TimeExclAvg.shift();\n"15569" FD.TimeExclAvg.push(0);\n"15570" }\n"15571"\n"15572" FD.Aggregate += 1;\n"15573" FD.AggregateSum += Time;\n"15574" FD.AggregateMax = FD.AggregateMax > Time ? FD.AggregateMax : Time;\n"15575" FD.AggregateMin = FD.AggregateMin < Time ? FD.AggregateMin : Time;\n"15576" FD.AggregateExclSum += TimeExcl;\n"15577" FD.AggregateExclMax = FD.AggregateExclMax > TimeExcl ? FD.AggregateExclMax : TimeExcl;\n"15578" FD.AggregateExclMin = FD.AggregateExclMin < TimeExcl ? FD.AggregateExclMin : TimeExcl;\n"15579" FD.AggregateCount += Count;\n"15580" var UpdatePos = AggregateHistorySize-1;\n"15581" if(UpdatePos != FD.TimeMax.length - 1)\n"15582" {\n"15583" debugger;\n"15584" }\n"15585"\n"15586" FD.TimeMax[UpdatePos] = FD.AggregateMax;\n"15587" FD.TimeMin[UpdatePos] = FD.AggregateMin;\n"15588" FD.TimeAvg[UpdatePos] = FD.AggregateSum / FD.Aggregate;\n"15589" FD.TimeCallAvg[UpdatePos] = FD.AggregateCount ? FD.AggregateSum / FD.AggregateCount : 0;\n"15590" FD.TimeCallExclAvg[UpdatePos] = FD.AggregateCount ? FD.AggregateExclSum / FD.AggregateCount : 0;\n"15591" FD.TimeTotal[UpdatePos] = FD.AggregateSum;\n"15592" FD.TimeExclTotal[UpdatePos] = FD.AggregateExclSum;\n"15593" FD.CallCount[UpdatePos] = FD.AggregateCount;\n"15594" FD.TimeExclAvg[UpdatePos] = FD.Aggregate ? FD.AggregateExclSum / FD.Aggregate : 0;\n"15595" FD.TimeExclMax[UpdatePos] = FD.AggregateExclMax;\n"15596" FD.TimeExclMin[UpdatePos] = FD.AggregateExclMin;\n"15597"\n"15598" if(Settings.AggregateFrames <= 0)\n"15599" {\n"15600" SetAggregateTimersInArray(FD, id);\n"15601" }\n"15602" SetTimersInArray(FD, id);\n"15603" };\n"15604" \n"15605"\n"15606" let TimerFrameData = F.x.t;\n"15607" for(var id in TimerFrameData)\n"15608" {\n"15609" var Data = TimerFrameData[id];\n"15610" var Time = Data[0];\n"15611" var TimeExcl = Data[1];\n"15612" var Count = Data[2];\n"15613" UpdateFrameDataInternal(id, Data[0], Data[1], Data[2]);\n"15614" }\n"15615"\n"15616" let CounterFrameData = F.x.c;\n"15617" for(let id in CounterFrameData)\n"15618" {\n"15619" let Value = CounterFrameData[id];\n"15620" UpdateFrameDataInternal(id, Value, 0, 0); //UpdateCounterDataInternal(id, Value);\n"15621" }\n"15622" var groups = {};\n"15623" for(var i = 0; i < F.g.length; ++i)\n"15624" {\n"15625" var id = F.gi[i];\n"15626" groups[id] = 1;\n"15627" var t = F.g[i];\n"15628" UpdateFrameDataInternal(id, t[0], t[1], t[2], 1);\n"15629" }\n"15630"\n"15631" let UpdateThreadInfo = function(o)\n"15632" {\n"15633" let sn = SanitizeString(o.n);\n"15634" let TI = ThreadInfo[sn];\n"15635" if(!TI)\n"15636" {\n"15637" TI = { ids:o.gi, a:[], n:o.n, sn:sn };\n"15638" for(let i = 0; i < TI.ids.length; ++i)\n"15639" {\n"15640" TI.a.push(AllocClearedArray(FRAME_COUNT));\n"15641" }\n"15642" ThreadInfo[sn] = TI;\n"15643" }\n"15644" for(let i = 0; i < o.gi.length; ++i)\n"15645" {\n"15646" let id = o.gi[i];\n"15647" let t = o.g[i][1];\n"15648" let te = FrameData.Time[FrameData.Time.length-1];\n"15649" if(t > te)\n"15650" {\n"15651" console.log(\"fail!\");\n"15652" // debugger;\n"15653" }\n"15654" let idx = TI.ids.indexOf(id);\n"15655" if(-1 == idx)\n"15656" {\n"15657" TI.ids.push(id);\n"15658" let a = AllocClearedArray(FRAME_COUNT);\n"15659" a[a.length-1] = o.g[i][1];\n"15660" TI.a.push(a);\n"15661" }\n"15662" else\n"15663" {\n"15664" let l = TI.a[idx].length;\n"15665" TI.a[idx][l-1] = o.g[i][1];\n"15666" }\n"15667" }\n"15668" };\n"15669" if(F.gt && F.gt.length)\n"15670" {\n"15671" for(let key in ThreadInfo)\n"15672" {\n"15673" let TI = ThreadInfo[key];\n"15674" for(let i = 0; i < TI.a.length; ++i)\n"15675" {\n"15676" PushIntoArray(TI.a[i], 0);\n"15677" }\n"15678" }\n"15679"\n"15680"\n"15681" for(let i = 0; i < F.gt.length; ++i)\n"15682" {\n"15683" let o = F.gt[i];\n"15684" UpdateThreadInfo(o);\n"15685" }\n"15686" }\n"15687"\n"15688"\n"15689"\n"15690" var ToDelete = new Array();\n"15691" for(var id in FrameData.TimerMap)\n"15692" {\n"15693" let FD = FrameData.TimerMap[id];\n"15694" if(!(F.x.t[id] || F.x.c[id]) && !groups[id])\n"15695" {\n"15696" PushIntoArray(FD.Time,0.0);\n"15697" PushIntoArray(FD.TimeExcl, 0.0);\n"15698" PushIntoArray(FD.Count, 0);\n"15699" FindMaxTime(FD.Time);\n"15700" FD.EmptyFrames++;\n"15701" }\n"15702" else\n"15703" {\n"15704" FD.EmptyFrames = 0;\n"15705" }\n"15706" FD.FrameTime = FD.Time[FD.Time.length-1]; //Fix her..?\n"15707" FD.AggregateTime = FD.Time[FD.Time.length-1];\n"15708"\n"15709" if(FD.EmptyFrames == FD.Time.length)\n"15710" {\n"15711" ToDelete.push(id);\n"15712" }\n"15713" }\n"15714" for(var i = 0; i < ToDelete.length; ++i)\n"15715" {\n"15716" delete FrameData.TimerMap[ToDelete[i]];\n"15717" }\n"15718" FramePending++;\n"15719"\n"15720"\n"15721" if(TriggerAutoCapture)\n"15722" {\n"15723" Capture();\n"15724" }\n"15725" ReferenceGraphAutomaticGroup = 1.05 * GraphTimeGroupMax;\n"15726" ReferenceGraphAutomatic = 1.05 * GraphTimeMax;\n"15727" ReferenceHistoryAutomatic = 1.05 * HistoryTimeMax;\n"15728" }\n"15729" RequestDraw();\n"15730" ProfileLeave();\n"15731"}\n"15732"\n"15733"function WSMessage(event)\n"15734"{\n"15735" // console.log(event.data);\n"15736" var Obj = JSON.parse(event.data);\n"15737" WSReceive++;\n"15738" WSReceiveBytes += event.data.length;\n"15739" var k = Obj.k;\n"15740" if(k == MSG_TIMER_TREE)\n"15741" {\n"15742" AddTimer(Obj.v);\n"15743" }\n"15744" else if(k == MSG_ENABLED)";1574515746const size_t g_MicroProfileHtmlLive_begin_4_size = sizeof(g_MicroProfileHtmlLive_begin_4);15747const char g_MicroProfileHtmlLive_begin_5[] =15748"\n"15749" {\n"15750" EnableTimer(Obj.v);\n"15751" }\n"15752" else if(k == MSG_FRAME)\n"15753" {\n"15754" ProcessFrame(Obj.v);\n"15755" }\n"15756" else if(k == MSG_LOADSETTINGS)\n"15757" {\n"15758" OnLoadPreset(Obj.v, 1, Obj.ro, Obj.name);\n"15759" }\n"15760" else if(k == MSG_CURRENTSETTINGS)\n"15761" {\n"15762" OnLoadPreset(Obj.v, 0, Obj.ro, Obj.name);\n"15763" }\n"15764" else if(k == MSG_PRESETS)\n"15765" {\n"15766" AddPresets(Obj.v);\n"15767" }\n"15768" else if(k == MSG_COUNTERS)\n"15769" {\n"15770" ProcessCounters(Obj.v);\n"15771" }\n"15772" else if(k == MSG_FUNCTION_RESULTS)\n"15773" {\n"15774" FunctionQueryPending = null;\n"15775" if(FunctionQueryReceived< Obj.q)\n"15776" {\n"15777" FunctionQueryArray = Obj.v;\n"15778" FunctionQueryReceived = Obj.q;\n"15779" console.log(\'got result from query \' + Obj.q);\n"15780" }\n"15781" else\n"15782" {\n"15783" console.log(\'ignored result from query \' + Obj.q);\n"15784" }\n"15785"\n"15786"\n"15787" }\n"15788" else if(k == MSG_INACTIVE_FRAME)\n"15789" {\n"15790" ProcessFrame(Obj.v, 1);\n"15791" }\n"15792" else if(k == MSG_FUNCTION_NAMES)\n"15793" {\n"15794" for(var i = 0; i < Obj.v.length; ++i)\n"15795" {\n"15796" FunctionsInstrumented.push(Obj.v[i][0]);\n"15797" FunctionsInstrumentedModule.push(Obj.v[i][1]);\n"15798" FunctionsInstrumentedUnmangled.push(Obj.v[i][2]);\n"15799"\n"15800" }\n"15801" }\n"15802" else if(k == MSG_INSTRUMENT_ERROR)\n"15803" {\n"15804" var D = Obj.v.data;\n"15805" var F = Obj.v.functions;\n"15806" var ASM_SERVER = \"http://microprofileasm.zapto.org\";\n"15807" var url = ASM_SERVER + \"/add/\" + Obj.v.version + \"/\";\n"15808" console.log(JSON.stringify(D));\n"15809" console.log(JSON.stringify(F));\n"15810" for(var i = 0; i < D.length; ++i)\n"15811" {\n"15812" url = url + D[i].code + \"/\";\n"15813" }\n"15814" var s = \"Failed to instrument the following functions:\\n\";\n"15815"\n"15816" for(var i = 0; i < F.length; ++i)\n"15817" {\n"15818" s = s + F[i] + \"\\n\";\n"15819" }\n"15820" s = s + \"\\n\\nPlease click \\\"OK\\\"to report the failed code segments\\n\"\n"15821" s = s + \"this will open the following url in a hidden frame\\n\"\n"15822" s = s + url;\n"15823" s = s + \"\\n-No additional data will be sent\\n-No symbol names will be sent\";\n"15824" s = s + \"\\n[this popup can be auto-denied or auto-accepted from the settings menu]\";\n"15825" if(Cookie.CodeReportMode != 2)\n"15826" {\n"15827" if(Cookie.CodeReportMode == 1 || confirm(s))\n"15828" {\n"15829" var iframe = document.createElement(\"iframe\");\n"15830" iframe.onload = function(){document.body.removeChild(iframe); console.log(\"removed iframe\");};\n"15831" console.log(\"opening url \" + url);\n"15832" iframe.setAttribute(\"src\", url);\n"15833" iframe.style.width = \"100x\";\n"15834" iframe.style.height = \"100px\";\n"15835" document.body.appendChild(iframe);\n"15836" }\n"15837" }\n"15838" console.log(\"got error \"+ JSON.stringify(Obj.v));\n"15839" }else if(k == MSG_QUERY_INDEX)\n"15840" {\n"15841" if(parseInt(Obj.qp))\n"15842" {\n"15843" FunctionQueryLastRequest = parseInt(Obj.qp);\n"15844" FunctionQueryReceived = FunctionQueryLastRequest;\n"15845" console.log(\"SET QUERY COUNTER \" + FunctionQueryLastRequest);\n"15846" }\n"15847" }\n"15848" else\n"15849" {\n"15850" console.log(\'hest!\');\n"15851" }\n"15852"\n"15853"}\n"15854"function WSError(event)\n"15855"{\n"15856" console.log(\'WSError\');\n"15857"}\n"15858"function WSClose(event)\n"15859"{\n"15860" console.log(\'WSClose\');\n"15861" let WSLocal = WS;\n"15862" WS = null;\n"15863" if(WSLocal)\n"15864" {\n"15865" WSIsOpen = 0;\n"15866" WSLocal.close();\n"15867" window.document.title = \"MicroProfile Live\";\n"15868" FilterInputDiv.style[\'display\'] = \'none\';\n"15869" }\n"15870"\n"15871"}\n"15872"function WSSendMessage(msgid)\n"15873"{\n"15874" if(WSIsOpen)\n"15875" {\n"15876" var str = \'\' + msgid;\n"15877" WSSend++;\n"15878" WSSendBytes += str.length;\n"15879" WS.send(str);\n"15880" }\n"15881" else\n"15882" {\n"15883" if(msgid[0] == \'c\')\n"15884" {\n"15885" console.log(\'failing to send \' + msgid);\n"15886" }\n"15887" }\n"15888"}\n"15889"\n"15890"\n"15891"function Connect()\n"15892"{\n"15893" WSSeconds = 0;\n"15894" if(WSOpenTime)\n"15895" WSSeconds = new Date() - WSOpenTime;\n"15896" let DidTimeout = WSSeconds > 5000;\n"15897"\n"15898" if(WS && (WS.readyState == 1 || WS.readyState == 0))\n"15899" {\n"15900" WSConnected = WS.readyState == 1;\n"15901" WSFail = 0;\n"15902" WSSeconds = 0;\n"15903" WSReadyState = WS.readyState;\n"15904" }\n"15905" else\n"15906" {\n"15907" WSConnected = 0;\n"15908" }\n"15909" if(!WS || (DidTimeout && !WSConnected))\n"15910" {\n"15911" WSReadyState = 999;\n"15912" if(WS)\n"15913" {\n"15914" WSFail++;\n"15915" WS.onopen = null;\n"15916" WS.onclose = null;\n"15917" WS.onmessage = null;\n"15918" WS.onerror = null;\n"15919" WS.close();\n"15920" WS = null;\n"15921" }\n"15922" WSOpenTime = new Date();\n"15923" WSPath = \"ws://\" + WSHost + \":\" + WSPort + \"/ws\";\n"15924" SetMessage(\'Connecting to \' + WSPath, 5 * 1000, 1);\n"15925" console.log(\"Open WebSocket \" + WSPath);\n"15926" WS = new WebSocket(WSPath);\n"15927" WS.onopen = WSOpen;\n"15928" WS.onmessage = WSMessage;\n"15929" WS.onerror = WSError;\n"15930" WS.onclose = WSClose;\n"15931" WSFail = 0;\n"15932" }\n"15933"\n"15934"\n"15935"\n"15936" RequestDraw();\n"15937"}\n"15938"\n"15939"\n"15940"function MouseDragPan()\n"15941"{\n"15942" return MouseDragButton == 1 || MouseDragKeyShift;\n"15943"}\n"15944"function MouseDragSelectRange()\n"15945"{\n"15946" return MouseDragState == MouseDragMove && (MouseDragButton == 3 || (MouseDragKeyShift&&MouseDragKeyCtrl));\n"15947"}\n"15948"\n"15949"function MouseHandleDrag()\n"15950"{\n"15951" if(MouseDragTarget == CanvasDetailedView)\n"15952" {\n"15953" if(SubMenuActive == -1)\n"15954" {\n"15955" if(MouseDragSelectRange() && SubMenuActive == -1)\n"15956" {\n"15957" var xStart = MouseDragXStart;\n"15958" var xEnd = MouseDragX;\n"15959" if(xStart > xEnd)\n"15960" {\n"15961" var Temp = xStart;\n"15962" xStart = xEnd;\n"15963" xEnd = Temp;\n"15964" }\n"15965" if(xEnd - xStart > 1)\n"15966" {\n"15967" MouseDragActiveXStart = xStart;\n"15968" MouseDragActiveXEnd = xEnd;\n"15969" }\n"15970" }\n"15971" else if(MouseDragPan())\n"15972" {\n"15973" var X = MouseDragX - MouseDragXLast;\n"15974" var Y = MouseDragY - MouseDragYLast;\n"15975" if(X && MouseDragActiveXStart < MouseDragActiveXEnd)\n"15976" {\n"15977" MouseDragActiveXStart += X;\n"15978" MouseDragActiveXEnd += X;\n"15979" }\n"15980" }\n"15981" if(Settings.ViewActive == VIEW_BAR)\n"15982" {\n"15983" if(MouseDragKeyShift || MouseDragButton == 1)\n"15984" {\n"15985" var X = MouseDragX - MouseDragXLast;\n"15986" var Y = MouseDragY - MouseDragYLast;\n"15987" nOffsetBarsY -= Y;\n"15988" nOffsetBarsX -= X;\n"15989" if(nOffsetBarsY < 0)\n"15990" {\n"15991" nOffsetBarsY = 0;\n"15992" }\n"15993" if(nOffsetBarsX < 0)\n"15994" {\n"15995" nOffsetBarsX = 0;\n"15996" }\n"15997" }\n"15998" }\n"15999" if(Settings.ViewActive == VIEW_COUNTERS)\n"16000" {\n"16001" if(MouseDragKeyShift || MouseDragButton == 1)\n"16002" {\n"16003" var Y = MouseDragY - MouseDragYLast;\n"16004" nOffsetCountersY -= Y;\n"16005" if(nOffsetCountersY < 0)\n"16006" {\n"16007" nOffsetCountersY = 0;\n"16008" }\n"16009" }\n"16010" }\n"16011" }\n"16012" else if(SubMenuActive == SubMenuTimers || SubMenuActive == SubMenuGroup || SubMenuActive == SubMenuCounters || SubMenuActive == SubMenuFunctions)\n"16013" {\n"16014" if(MouseDragKeyShift || MouseDragButton == 1)\n"16015" {\n"16016" var Y = MouseDragY - MouseDragYLast;\n"16017" if(SubMenuActive == SubMenuTimers)\n"16018" {\n"16019" nOffsetMenuTimers -= Y;\n"16020" if(nOffsetMenuTimers < 0)\n"16021" {\n"16022" nOffsetMenuTimers = 0;\n"16023" }\n"16024" }\n"16025" else if(SubMenuActive == SubMenuFunctions)\n"16026" {\n"16027" nOffsetMenuFunctions -= Y;\n"16028" if(nOffsetMenuFunctions < 0)\n"16029" {\n"16030" nOffsetMenuFunctions = 0;\n"16031" }\n"16032" }\n"16033" else if(SubMenuActive == SubMenuGroup)\n"16034" {\n"16035" nOffsetMenuGroup -= Y;\n"16036" if(nOffsetMenuGroup < 0)\n"16037" {\n"16038" nOffsetMenuGroup = 0;\n"16039" }\n"16040" }\n"16041" else if(SubMenuActive == SubMenuCounters)\n"16042" {\n"16043" nOffsetMenuCounters -= Y;\n"16044" if(nOffsetMenuCounters < 0)\n"16045" {\n"16046" nOffsetMenuCounters = 0;\n"16047" }\n"16048" }\n"16049" }\n"16050" }\n"16051" }\n"16052" MouseDragXLast = MouseDragX;\n"16053" MouseDragYLast = MouseDragY;\n"16054"}\n"16055"function MouseHandleDragEnd()\n"16056"{\n"16057" if(MouseDragTarget == CanvasDetailedView)\n"16058" {\n"16059"\n"16060" }\n"16061"}\n"16062"\n"16063"function MouseHandleDragClick()\n"16064"{\n"16065" if(SubMenuActive == -1)\n"16066" {\n"16067" if(nHoverCounter != -1)\n"16068" {\n"16069" if(TimerArray[nHoverCounter].firstchild != -1)\n"16070" {\n"16071" TimerArray[nHoverCounter].closed = !TimerArray[nHoverCounter].closed;\n"16072" }\n"16073" else\n"16074" {\n"16075" TimerArray[nHoverCounter].Expanded = !TimerArray[nHoverCounter].Expanded;\n"16076" }\n"16077" Draw(1);\n"16078" }\n"16079" }\n"16080" if(MouseInCaptureButton)\n"16081" {\n"16082" TriggerCapture();\n"16083" }\n"16084"}\n"16085"\n"16086"function MapMouseButton(event)\n"16087"{\n"16088" if(event.button == 1 || event.which == 1)\n"16089" {\n"16090" return 1;\n"16091" }\n"16092" else if(event.button == 3 || event.which == 3)\n"16093" {\n"16094" return 3;\n"16095" }\n"16096" else\n"16097" {\n"16098" return 0;\n"16099" }\n"16100"}\n"16101"\n"16102"function MouseDragReset()\n"16103"{\n"16104" MouseDragState = MouseDragOff;\n"16105" MouseDragTarget = 0;\n"16106" MouseDragKeyShift = 0;\n"16107" MouseDragKeyCtrl = 0;\n"16108" MouseDragButton = 0;\n"16109"}\n"16110"function MouseDragKeyUp()\n"16111"{\n"16112" if((MouseDragKeyShift && !KeyShiftDown) || (MouseDragKeyCtrl && !KeyCtrlDown))\n"16113" {\n"16114" MouseHandleDragEnd();\n"16115" MouseDragReset();\n"16116" }\n"16117"}\n"16118"function MouseDrag(Source, Event)\n"16119"{\n"16120" if(Source == MouseDragOff || (MouseDragTarget && MouseDragTarget != Event.target))\n"16121" {\n"16122" MouseDragReset();\n"16123" return;\n"16124" }\n"16125"\n"16126" var LocalRect = Event.target.getBoundingClientRect();\n"16127" MouseDragX = Event.clientX - LocalRect.left;\n"16128" MouseDragY = Event.clientY - LocalRect.top;\n"16129" if(MouseDragState == MouseDragMove)\n"16130" {\n"16131" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"16132" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"16133" if((Source == MouseDragUp && MapMouseButton(Event) == MouseDragButton) ||\n"16134" (MouseDragKeyCtrl && !KeyCtrlDown) ||\n"16135" (MouseDragKeyShift && !KeyShiftDown))\n"16136" {\n"16137" MouseHandleDragEnd();\n"16138" MouseDragReset();\n"16139" return;\n"16140" }\n"16141" else\n"16142" {\n"16143" MouseHandleDrag();\n"16144" }\n"16145" }\n"16146" else if(MouseDragState == MouseDragOff)\n"16147" {\n"16148" if(Source == MouseDragDown || KeyShiftDown || KeyCtrlDown)\n"16149" {\n"16150" MouseDragTarget = Event.target;\n"16151" MouseDragButton = MapMouseButton(Event);\n"16152" MouseDragState = MouseDragDown;\n"16153" MouseDragXStart = MouseDragX;\n"16154" MouseDragYStart = MouseDragY;\n"16155" MouseDragKeyCtrl = 0;\n"16156" MouseDragKeyShift = 0;\n"16157"\n"16158" if(KeyShiftDown || KeyCtrlDown)\n"16159" {\n"16160" MouseDragKeyShift = KeyShiftDown;\n"16161" MouseDragKeyCtrl = KeyCtrlDown;\n"16162" MouseDragState = MouseDragMove;\n"16163" }\n"16164" }\n"16165" }\n"16166" else if(MouseDragState == MouseDragDown)\n"16167" {\n"16168" if(Source == MouseDragUp)\n"16169" {\n"16170" MouseHandleDragClick();\n"16171" MouseDragReset();\n"16172" }\n"16173" else if(Source == MouseDragMove)\n"16174" {\n"16175" var dx = Math.abs(MouseDragX - MouseDragXStart);\n"16176" var dy = Math.abs(MouseDragY - MouseDragYStart);\n"16177" if(dx+dy>1)\n"16178" {\n"16179" MouseDragState = MouseDragMove;\n"16180" }\n"16181" }\n"16182" }\n"16183" MouseDragXLast = MouseDragX;\n"16184" MouseDragYLast = MouseDragY;\n"16185"}\n"16186"\n"16187"\n"16188"function MouseMove(evt)\n"16189"{\n"16190" evt.preventDefault();\n"16191" var rect = evt.target.getBoundingClientRect();\n"16192" var x = evt.clientX - rect.left;\n"16193" var y = evt.clientY - rect.top;\n"16194" MouseX = x;\n"16195" MouseY = y;\n"16196" MouseMoveTime = new Date();\n"16197" MouseDrag(MouseDragMove, evt);\n"16198" RequestDraw();\n"16199"}\n"16200"\n"16201"\n"16202"function MouseSortClick()\n"16203"{\n"16204" if(SubMenuActive == -1)\n"16205" {\n"16206" if(SortColumnMouseOverNext)\n"16207" {\n"16208" if(SortColumnMouseOverNext == Settings.SortColumnName)\n"16209" {\n"16210" Settings.SortColumnOrderFlip = 1 - Settings.SortColumnOrderFlip;\n"16211" }\n"16212" else\n"16213" {\n"16214" Settings.SortColumnOrderFlip = 0;\n"16215" }\n"16216"\n"16217" Settings.SortColumnName = SortColumnMouseOverNext;\n"16218" SortColumnMouseOverNext = null;\n"16219" }\n"16220" }\n"16221"}\n"16222"\n"16223"\n"16224"function MouseButton(bPressed, evt)\n"16225"{\n"16226" evt.preventDefault();\n"16227" MouseReleased = !bPressed;\n"16228" MouseDrag(bPressed ? MouseDragDown : MouseDragUp, evt);\n"16229" if(!bPressed)\n"16230" MouseSortClick();\n"16231" RequestDraw();\n"16232"}\n"16233"\n"16234"function MouseOut(evt)\n"16235"{\n"16236" MouseDrag(MouseDragOff, evt);\n"16237" KeyCtrlDown = 0;\n"16238" KeyShiftDown = 0;\n"16239"}\n"16240"\n"16241"function MouseWheel(e)\n"16242"{\n"16243"}\n"16244"\n"16245"function KeyUp(evt)\n"16246"{\n"16247" let k = evt.keyCode;\n"16248" let InputActive = SubMenuActive == SubMenuTimers || SubMenuActive == SubMenuGroup || SubMenuActive == SubMenuCounters || SubMenuActive == SubMenuFunctions || SubMenuActive == SubMenuPatched || SubMenuActive == SubMenuModules;\n"16249" if(IsPromptActive())\n"16250" return;\n"16251" if(!InputActive)\n"16252" {\n"16253" if(k == 220)\n"16254" {\n"16255" ProfileMode = !ProfileMode;\n"16256" }\n"16257" if(k == 191)\n"16258" {\n"16259" WSPort++;\n"16260" if(WSPort > 1338+2)\n"16261" {\n"16262" WSPort = 1338;\n"16263" }\n"16264" if(WS)\n"16265" {\n"16266" WS.close();\n"16267" WS = null;\n"16268" }\n"16269" }\n"16270" if(k == 32)\n"16271" {\n"16272" if(0) //for debugging.\n"16273" {\n"16274" console.log(\"FrameData =\");\n"16275" console.log(JSON.stringify(FrameData));\n"16276" console.log(\"TimerArray =\");\n"16277" console.log(JSON.stringify(TimerArray));\n"16278" }\n"16279" if(KeyCtrlDown)\n"16280" {\n"16281" ToggleCompressedView();\n"16282" }\n"16283" else\n"16284" { \n"16285" WSSendMessage(\"f\");\n"16286" }\n"16287" }\n"16288" if(k == 88)\n"16289" {\n"16290" ToggleView();\n"16291" }\n"16292" if(k == 13)\n"16293" {\n"16294" TriggerCapture();\n"16295" }\n"16296" if(k == 72)\n"16297" {\n"16298" ShowHelp(0, 1);\n"16299" }\n"16300"\n"16301"\n"16302" }\n"16303" if(k == 27)\n"16304" {\n"16305" if(FilterInput.value.trim() != \"\")\n"16306" {\n"16307" FilterInput.value = \"\";\n"16308" }\n"16309" else\n"16310" {\n"16311" EnableMenu(-1);\n"16312" }\n"16313"\n"16314" MouseDragActiveXStart = MouseDragActiveXEnd = -1;\n"16315" Settings.SortColumnName = \"\";\n"16316" ShowHelp(0);\n"16317" }\n"16318"\n"16319" if(evt.keyCode == 17)\n"16320" {\n"16321" KeyCtrlDown = 0;\n"16322" MouseDragKeyUp();\n"16323" }\n"16324" if(evt.keyCode == 16)\n"16325" {\n"16326" KeyShiftDown = 0;\n"16327" MouseDragKeyUp();\n"16328" }\n"16329"}\n"16330"\n"16331"function KeyDown(evt)\n"16332"{\n"16333" if(IsPromptActive())\n"16334" return;\n"16335"\n"16336" // console.log(\"keydow \", k);\n"16337" if(evt.keyCode == 17)\n"16338" {\n"16339" KeyCtrlDown = 1;\n"16340" MouseDragKeyUp();\n"16341" }\n"16342" if(evt.keyCode == 16)\n"16343" {\n"16344" KeyShiftDown = 1;\n"16345" MouseDragKeyUp();\n"16346" }\n"16347"}\n"16348"\n"16349"\n"16350"function SetupEvents()\n"16351"{\n"16352" var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? \"DOMMouseScroll\" : \"mousewheel\"; //FF doesn\'t recognize mousewheel as of\n"16353" CanvasDetailedView.addEventListener(\'mousemove\', MouseMove, false);\n"16354" CanvasDetailedView.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n"16355" CanvasDetailedView.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n"16356" CanvasDetailedView.addEventListener(\'mouseout\', MouseOut);\n"16357" CanvasDetailedView.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n"16358" CanvasDetailedView.addEventListener(mousewheelevt, MouseWheel, false);\n"16359" window.addEventListener(\'keydown\', KeyDown);\n"16360" window.addEventListener(\'keyup\', KeyUp);\n"16361" window.addEventListener(\'resize\', ResizeCanvas, false);\n"16362"}\n"16363"\n"16364"function DrawToolTip(StringArray, Canvas, x, y)\n"16365"{\n"16366" if(!ShowMenu())\n"16367" {\n"16368" return;\n"16369" }\n"16370" let colors;\n"16371" let a = StringArray;\n"16372" if(StringArray.c)\n"16373" {\n"16374" a = StringArray.a;\n"16375" colors = StringArray.c;\n"16376" }\n"16377" var context = Canvas.getContext(\'2d\');\n"16378" context.font = Font;\n"16379" var WidthArray = Array(a.length);\n"16380" var nMaxWidth = 0;\n"16381" var nHeight = 0;\n"16382" for(var i = 0; i < a.length; i += 2)\n"16383" {\n"16384" var nWidth0 = context.measureText(a[i]).width;\n"16385" var nWidth1 = context.measureText(a[i+1]).width;\n"16386" var nSum = nWidth0 + nWidth1;\n"16387" WidthArray[i] = nWidth0;\n"16388" WidthArray[i+1] = nWidth1;\n"16389" if(nSum > nMaxWidth)\n"16390" {\n"16391" nMaxWidth = nSum;\n"16392" }\n"16393" nHeight += BoxHeight;\n"16394" }\n"16395" nMaxWidth += 15;\n"16396" //bounds check.\n"16397" x = Math.max(0, x - 10 - nMaxWidth);\n"16398" var CanvasRect = Canvas.getBoundingClientRect();\n"16399" if(y + nHeight > CanvasRect.height)\n"16400" {\n"16401" y = CanvasRect.height - nHeight;\n"16402" x += 20;\n"16403" }\n"16404" if(x + nMaxWidth > CanvasRect.width)\n"16405" {\n"16406" x = CanvasRect.width - nMaxWidth;\n"16407" }\n"16408"\n"16409" context.fillStyle = \'black\';\n"16410" context.fillRect(x-1, y, nMaxWidth+2, nHeight);\n"16411" context.fillStyle = \'white\';\n"16412"\n"16413" var XPos = x;\n"16414" var XPosRight = x + nMaxWidth;\n"16415" var YPos = y + BoxHeight-2;\n"16416" context.fillStyle = \'white\';\n"16417" for(i = 0; i < a.length; i += 2)\n"16418" {\n"16419" if(colors)\n"16420" context.fillStyle = colors[i];\n"16421" context.fillText(a[i], XPos, YPos);\n"16422" if(colors)\n"16423" context.fillStyle = colors[i+1];\n"16424" context.fillText(a[i+1], XPosRight - WidthArray[i+1], YPos);\n"16425" YPos += BoxHeight;\n"16426" }\n"16427" context.fillStyle = \'white\';\n"16428"}\n"16429"\n"16430"function DrawPlotf(Canvas)\n"16431"{\n"16432" return;\n"16433" var context = Canvas.getContext(\'2d\');\n"16434" context.font = Font;\n"16435" var WidthArray = Array(PlotfArray.length);\n"16436" var nMaxWidth = 0;\n"16437" var nHeight = 0;\n"16438"\n"16439" context.font = Font;\n"16440" for(i = 0; i < PlotfArray.length; i++)\n"16441" {\n"16442" var nWidth = context.measureText(PlotfArray[i]).width;\n"16443" WidthArray[i] = nWidth;\n"16444" if(nWidth > nMaxWidth)\n"16445" {\n"16446" nMaxWidth = nWidth;\n"16447" }\n"16448" nHeight += BoxHeight;\n"16449" }\n"16450" nMaxWidth += 15;\n"16451" var x = 0;\n"16452" var y = 0;\n"16453"\n"16454" context.fillStyle = \'black\';\n"16455" context.fillRect(x-1, y, nMaxWidth+2, nHeight);\n"16456" context.fillStyle = \'white\';\n"16457"\n"16458" var XPos = x;\n"16459" var XPosRight = x + nMaxWidth;\n"16460" var YPos = y + BoxHeight-2;\n"16461" for(i = 0; i < PlotfArray.length; i++)\n"16462" {\n"16463" context.fillText(PlotfArray[i], XPos, YPos);\n"16464" YPos += BoxHeight;\n"16465" }\n"16466"}\n"16467"\n"16468"\n"16469"function ShiftRight10(v)\n"16470"{\n"16471" if(v > 1024)\n"16472" {\n"16473" return v / 1024.0;\n"16474" }\n"16475" else\n"16476" {\n"16477" return v >> 10;\n"16478" }\n"16479"}\n"16480"\n"16481"function FormatCounter(Format, Counter)\n"16482"{\n"16483" if(!Counter)\n"16484" {\n"16485" return \'0\';\n"16486" }\n"16487" var Negative = 0;\n"16488" if(Counter < 0)\n"16489" {\n"16490" Counter = -Counter;\n"16491" Negative = 1;\n"16492" if(Counter < 0) // handle INT_MIN\n"16493" {\n"16494" Counter = -(Counter+1);\n"16495" if(Counter < 0)\n"16496" {\n"16497" return \'?\';\n"16498" }\n"16499" }\n"16500" }\n"16501" var str = Negative ? \'-\' :\'\' ;\n"16502" if(Format == FormatCounterDefault)\n"16503" {\n"16504" var Seperate = 0;\n"16505" var result = \'\';\n"16506" while (Counter)\n"16507" {\n"16508" if (Seperate)\n"16509" {\n"16510" result += \'.\';\n"16511" }\n"16512" Seperate = 1;\n"16513" for (var i = 0; Counter && i < 3; ++i)\n"16514" {\n"16515" var Digit = Math.floor(Counter % 10);\n"16516" Counter = Math.floor(Counter / 10);\n"16517" result += \'\' + Digit;\n"16518" }\n"16519" }\n"16520"\n"16521" for(var i = 0; i < result.length; ++i)\n"16522" {\n"16523" str += result[result.length-1-i];\n"16524" }\n"16525" return str;\n"16526" }\n"16527" else if(Format == FormatCounterBytes)\n"16528" {\n"16529" var Shift = 0;\n"16530" var Divisor = 1;\n"16531" var CountShifted = ShiftRight10(Counter);\n"16532" while(CountShifted)\n"16533" {\n"16534" Divisor <<= 10;\n"16535" CountShifted = ShiftRight10(CountShifted);\n"16536" Shift++;\n"16537" }\n"16538" if(Shift)\n"16539" {\n"16540" return str + (Counter / Divisor).toFixed(2) + \'\' + FormatCounterBytesExt[Shift];\n"16541" }\n"16542" else\n"16543" {\n"16544" return str + Counter.toFixed(2) + \'\' + FormatCounterBytesExt[0];\n"16545" }\n"16546" }\n"16547" return \'?\';\n"16548"}\n"16549"function DrawCounterView(View, LocalMouseX, LocalMouseY, SubIndex)\n"16550"{\n"16551" var TimerMap = FrameData.TimerMap;\n"16552" if(!TimerMap)\n"16553" return;\n"16554"\n"16555"\n"16556" ProfileEnter(\"DrawCounterView\");\n"16557"\n"16558" var Canvas = View.Canvas[View.BackBuffer];\n"16559" var context = Canvas.getContext(\'2d\');\n"16560" context.clearRect(0, 0, View.w, View.h);\n"16561"\n"16562"\n"16563"\n"16564" var Height = BoxHeight;\n"16565" var Width = nWidth;\n"16566" var nTotalRows = CounterArray.length;\n"16567" var nTotalRowPixels = nTotalRows * Height;\n"16568" var nFrameRows = nHeight - BoxHeight;\n"16569" if(nOffsetCountersY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\n"16570" {\n"16571" nOffsetCountersY = nTotalRowPixels - nFrameRows;\n"16572" }\n"16573" var CounterWidth = 150;\n"16574" var Y = -nOffsetCountersY + BoxHeight;\n"16575" var X = 0;\n"16576" var nColorIndex = 0;\n"16577" context.fillStyle = \'white\';\n"16578" context.font = Font;\n"16579" var bMouseIn = 0;\n"16580" function DrawHeaderSplitSingle(Header, Width)\n"16581" {\n"16582" context.fillStyle = \'white\';\n"16583" context.fillText(Header, X, Height-FontAscent);\n"16584" X += Width;\n"16585" context.fillStyle = nBackColorOffset;\n"16586" context.fillRect(X-3, 0, 1, nHeight);\n"16587" }\n"16588" function DrawHeaderSplitSingleRight(Header, Width)\n"16589" {\n"16590" X += Width;\n"16591" context.fillStyle = \'white\';\n"16592" context.textAlign = \'right\';\n"16593" context.fillText(Header, X - FontWidth, Height-FontAscent);\n"16594" context.fillStyle = nBackColorOffset;\n"16595" context.fillRect(X, 0, 1, nHeight);\n"16596" context.textAlign = \'left\';\n"16597" }\n"16598" var TimerLen = 6;\n"16599" var TimerWidth = TimerLen * FontWidth;\n"16600" nHoverCounter = -1;\n"16601" function CounterIndent(Level)\n"16602" {\n"16603" return Level * 4 * FontWidth;\n"16604" }\n"16605" function Max(a, b)\n"16606" {\n"16607" return a > b ? a : b;\n"16608" }\n"16609"\n"16610" function DrawCounterRecursive(Index)\n"16611" {\n"16612" var Counter = TimerArray[Index];\n"16613" if(Counter.idtype == TYPE_COUNTER)\n"16614" {\n"16615" var Indent = CounterIndent(Counter.depth-1);\n"16616" var X = 0;\n"16617" nColorIndex = 1-nColorIndex;\n"16618" var HeightExpanded = Counter.Expanded ? Height * 5 : Height;\n"16619"\n"16620" bMouseIn = LocalMouseY >= Y && LocalMouseY < Y + HeightExpanded;\n"16621" if(bMouseIn)\n"16622" {\n"16623" nHoverCounter = Index;\n"16624" }\n"16625" var bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n"16626" context.fillStyle = bgcolor;\n"16627" context.fillRect(0, Y, Width, HeightExpanded);\n"16628" context.fillStyle = \'white\';\n"16629" var c = Counter.closed ? \'*\' : \' \';\n"16630" context.fillText(c + Counter.name, Indent, Y+Height-FontAscent);\n"16631" X += CounterNameWidth;\n"16632" X += CounterValueWidth - FontWidth;\n"16633" context.textAlign = \'right\';\n"16634" context.fillText(Counter.formatted, X, Y+Height-FontAscent);\n"16635" context.textAlign = \'left\';\n"16636" X += FontWidth * 4;\n"16637" var Y0 = Y + 1;\n"16638" if(Counter.limit != 0)\n"16639" {\n"16640" context.fillText(Counter.formattedlimit, X, Y+Height-FontAscent);\n"16641" X += CounterLimitWidth;\n"16642" var X0 = X + 1;\n"16643" context.fillStyle = \'white\';\n"16644" context.fillRect(X0, Y0, Counter.boxprc * (CounterWidth-2), Height-2);\n"16645" context.fillStyle = bgcolor;\n"16646" context.fillRect(X0+1, Y0+1, Counter.boxprc * (CounterWidth-4), Height-4);\n"16647" context.fillStyle = \'cyan\';\n"16648" context.fillRect(X0+1, Y0+1, Counter.counterprc * (CounterWidth-4), Height-4);\n"16649" X += CounterWidth + 10;\n"16650" }\n"16651" else\n"16652" {\n"16653" X += CounterLimitWidth;\n"16654" X += CounterWidth + 10;\n"16655" }\n"16656"\n"16657" if(Counter.minvalue != Counter.maxvalue)\n"16658" {\n"16659" var CounterHistory = Counter.counterhistory;\n"16660" var Prc = CounterHistory.prc;\n"16661" context.fillStyle = \'cyan\';\n"16662" context.strokeStyle = \'cyan\';\n"16663" context.globalAlpha = 0.5;\n"16664" context.beginPath();\n"16665" var x = X;\n"16666" var YBase = Y0 + HeightExpanded-1;\n"16667" var YOffset = -(HeightExpanded-2);\n"16668"\n"16669" context.moveTo(X, Y0);\n"16670" for(var i = 0; i < Prc.length; ++i)\n"16671" {\n"16672" context.moveTo(x, YBase);\n"16673" context.lineTo(x, YBase + Prc[i] * YOffset);\n"16674" x += 1;\n"16675" }\n"16676" context.stroke();\n"16677"\n"16678" x = X;\n"16679" context.globalAlpha = 1.0;\n"16680" context.beginPath();\n"16681" context.moveTo(X, YBase);\n"16682"\n"16683" for(var i = 0; i < Prc.length; ++i)\n"16684" {\n"16685" context.lineTo(x, YBase + Prc[i] * YOffset);\n"16686" x += 1;\n"16687" }\n"16688" context.stroke();\n"16689" if(bMouseIn)\n"16690" {\n"16691" var MouseGraphX = Math.floor(LocalMouseX - X);\n"16692" if(MouseGraphX >= 0 && MouseGraphX < CounterHistory.history.length)\n"16693" {\n"16694" context.fillStyle = \'white\';\n"16695" var Formatted = FormatCounter(Counter.format, CounterHistory.history[MouseGraphX]);\n"16696" context.fillText(Formatted, X, Y+Height-FontAscent);\n"16697" }\n"16698" context.strokeStyle = \'orange\';\n"16699" context.beginPath();\n"16700" var CrossX = X + MouseGraphX;\n"16701" var CrossY = YBase + Prc[MouseGraphX] * YOffset;\n"16702" context.moveTo(CrossX-2, CrossY-2);\n"16703" context.lineTo(CrossX+2, CrossY+2);\n"16704" context.moveTo(CrossX+2, CrossY-2);\n"16705" context.lineTo(CrossX-2, CrossY+2);\n"16706" context.stroke();\n"16707"\n"16708" }\n"16709" X += Prc.length + 5;\n"16710" context.fillStyle = \'white\';\n"16711" context.fillText( FormatCounter(Counter.format, Counter.minvalue), X, Y + Height - FontAscent);\n"16712" X += CounterWidth + 5;\n"16713" context.fillText( FormatCounter(Counter.format, Counter.maxvalue), X, Y + Height - FontAscent);\n"16714" X += CounterWidth + 5;\n"16715" }\n"16716" Y += HeightExpanded;\n"16717" }\n"16718"\n"16719" if(Index == 0 || (!Counter.closed && Counter.idtype == TYPE_COUNTER))\n"16720" {\n"16721" var ChildIndex = Counter.firstchild;\n"16722" while(ChildIndex != -1)\n"16723" {\n"16724" DrawCounterRecursive(ChildIndex);\n"16725" ChildIndex = TimerArray[ChildIndex].sibling;\n"16726" }\n"16727" }\n"16728" }\n"16729"\n"16730" DrawCounterRecursive(0);\n"16731"\n"16732" X = 0;\n"16733" context.fillStyle = nBackColorOffset;\n"16734" context.fillRect(0, 0, Width, Height);\n"16735" context.fillStyle = \'white\';\n"16736" DrawHeaderSplitSingle(\'Name\', CounterNameWidth);\n"16737" DrawHeaderSplitSingleRight(\'Value\', CounterValueWidth + (FontWidth+1));\n"16738" DrawHeaderSplitSingle(\'Limit\', CounterLimitWidth + CounterWidth + 3 * (FontWidth+1));\n"16739" ProfileLeave();\n"16740"}\n"16741"\n"16742"function ShowHelp(Show, Toggle)\n"16743"{\n"16744" var HelpWindow = document.getElementById(\'helpwindow\');\n"16745" if(Toggle)\n"16746" {\n"16747" if(HelpWindow.style[\'display\'] == \'block\')\n"16748" {\n"16749" HelpWindow.style[\'display\'] = \'none\';\n"16750" }\n"16751" else\n"16752" {\n"16753" HelpWindow.style[\'display\'] = \'block\';\n"16754" }\n"16755" }\n"16756" else\n"16757" {\n"16758" if(Show)\n"16759" {\n"16760" HelpWindow.style[\'display\'] = \'block\';\n"16761" }\n"16762" else\n"16763" {\n"16764" HelpWindow.style[\'display\'] = \'none\';\n"16765" }\n"16766" }\n"16767"}\n"16768"\n"16769"function ParseUrl()\n"16770"{\n"16771" var path = window.location.pathname;\n"16772" var idx = path.indexOf(\'/\');\n"16773" if(idx < 0)\n"16774" return;\n"16775" var StrCommand = path.substring(idx+1);\n"16776" idx = StrCommand.indexOf(\'/\');\n"16777" if(idx < 0)\n"16778" return;\n"16779" var StrSettings = StrCommand.substring(idx+1);\n"16780" PresetToLoad = StrSettings;\n"16781" PresetToLoadRO = StrCommand[0] == \'b\';\n"16782"}\n"16783"\n"16784"\n"16785"function GetCookie()\n"16786"{\n"16787" var result = document.cookie.match(/fisk=([^;]+)/);\n"16788" if(result && result.length > 0)\n"16789" {\n"16790" var Obj = JSON.parse(result[1]);\n"16791" if(!Obj.offline)\n"16792" {\n"16793" var C = {};\n"16794" C.offline = Obj;\n"16795" Obj = C;\n"16796" }\n"16797" return Obj;\n"16798" }\n"16799" else\n"16800" {\n"16801" return {offline:{},live:{}};\n"16802" }\n"16803"}\n"16804"\n"16805"function ReadCookie()\n"16806"{\n"16807" var C = GetCookie().live;\n"16808" for(var i in C)\n"16809" {\n"16810" Cookie[i] = C[i];\n"16811" }\n"16812"}\n"16813"function WriteCookie()\n"16814"{\n"16815" var C = GetCookie();\n"16816" C.live = {};\n"16817" for(var i in Cookie)\n"16818" {\n"16819" C.live[i] = Cookie[i];\n"16820" }\n"16821"\n"16822" var date = new Date();\n"16823" date.setFullYear(2099);\n"16824" var cookie = \'fisk=\' + JSON.stringify(C) + \';expires=\' + date;\n"16825" document.cookie = cookie;\n"16826"}\n"16827"\n"16828"let CSVSets = {};\n"16829"let CSVIndex = 0;\n"16830"function CreateCSVSetFile(Set, Filename)\n"16831"{\n"16832" let File = {};\n"16833" File.Name = Filename;\n"16834" File.DataSorted = [];\n"16835" File.Data = [];\n"16836" File.ColumnToIndex = {};\n"16837" File.ColumnsSorted = {};\n"16838" File.Columns = {};\n"16839" return File;\n"16840"\n"16841"}\n"16842"function CreateCSVSet()\n"16843"{\n"16844" let Index = ++CSVIndex;\n"16845" let Name = \"Drop_\" + Index;\n"16846" let Set = {};\n"16847" Set.Name = Name;\n"16848" Set.Files = {};\n"16849" Set.Columns = {};\n"16850" Set.ColumnNames = {};\n"16851" Set.ColumnIndex = 0;\n"16852" Set.PendingCount = 0;\n"16853" Set.FinishedCount = 0;\n"16854" return Set;\n"16855"}\n"16856"function ParseCSVCheckFinished(Name)\n"16857"{\n"16858" let Set = CSVSets[Name];\n"16859" console.log(\"Finished parsing \", Set.FinishedCount, \":\", Set.PendingCount);\n"16860" if(Set.FinishedCount == Set.PendingCount)\n"16861" {\n"16862" if(Set.FinishedCount == 0)\n"16863" {\n"16864" console.error(\"No CSV files were parsable\");\n"16865" CSVSets[Name] = null;\n"16866" }\n"16867" else\n"16868" {\n"16869" for(let CName in Set.ColumnNames)\n"16870" {\n"16871" let aggr = {};\n"16872" let MaxCount = 0;\n"16873" console.log(\"aggr for \", CName);\n"16874" for(let F in Set.Files)\n"16875" {\n"16876" let File = Set.Files[F];\n"16877" if(File.Columns[CName])\n"16878" MaxCount = Math.max(MaxCount, File.Columns[CName].length);\n"16879" }\n"16880" let count = new Array(MaxCount);\n"16881" let sum = new Array(MaxCount);\n"16882" let min = new Array(MaxCount);\n"16883" let max = new Array(MaxCount);\n"16884" let avg = new Array(MaxCount);\n"16885" for(let i = 0; i < MaxCount; ++i)\n"16886" {\n"16887" count[i] = 0;\n"16888" sum[i] = 0;\n"16889" min[i] = 1e28;\n"16890" max[i] = -1e28;\n"16891" }\n"16892" for(let F in Set.Files)\n"16893" {\n"16894" let File = Set.Files[F];\n"16895" if(File.Columns[CName])\n"16896" {\n"16897" let c = File.Columns[CName];\n"16898" for(let i = 0; i < c.length; ++i)\n"16899" {\n"16900" count[i]++;\n"16901" sum[i] += c[i];\n"16902" min[i] = Math.min(c[i], min[i]);\n"16903" max[i] = Math.max(c[i], max[i]);\n"16904"\n"16905" }\n"16906" }\n"16907" }\n"16908" for(let i = 0; i < MaxCount; ++i)\n"16909" {\n"16910" if(count[i])\n"16911" {\n"16912" avg[i] = sum[i] / count[i];\n"16913" console.log(\".. \", avg[i], \" min \", min[i]);\n"16914" }\n"16915" else\n"16916" {\n"16917" min[i] = 0;\n"16918" max[i] = 0;\n"16919" }\n"16920" }\n"16921" }\n"16922" }\n"16923" }\n"16924"}\n"16925"function ParseCSVLine(Line)\n"16926"{\n"16927" let Pos = 0;\n"16928" let Start = 0;\n"16929" let Len = Line.length;\n"16930" let InBrackets = 0;\n"16931" let Out = new Array();\n"16932" let BracketStart = -1;\n"16933" let BracketEnd = -1;\n"16934" let push = function()\n"16935" {\n"16936" if(BracketStart >= 0)\n"16937" {\n"16938" console.assert(BracketEnd >= 0);\n"16939" Out.push(Line.slice(BracketStart+1, BracketEnd));\n"16940" }\n"16941" else\n"16942" {\n"16943" Out.push(Line.slice(Start, Pos).trim());\n"16944"\n"16945" }\n"16946" Start = Pos+1;\n"16947" InBrackets = 0;\n"16948" BracketStart = -1;\n"16949" BracketEnd = -1;\n"16950" };\n"16951" while(Pos != Len)\n"16952" {\n"16953" let Char = Line[Pos];\n"16954" if(InBrackets)\n"16955" {\n"16956" if(Char == \"\\\"\")\n"16957" {\n"16958" BracketEnd = Pos;\n"16959" InBrackets = 0;\n"16960" }\n"16961" }\n"16962" else\n"16963" {\n"16964" if(Char == \"\\\"\")\n"16965" {\n"16966" BracketStart = Pos;\n"16967" InBrackets = 1;\n"16968" }\n"16969" else if(Char == \",\")\n"16970" {\n"16971" push();\n"16972" }\n"16973" }\n"16974" Pos++;\n"16975" }\n"16976" push();\n"16977" return Out;\n"16978"\n"16979"}\n"16980"\n"16981"function ParseCSVFile(Set, Result, Name)\n"16982"{\n"16983" let File = CreateCSVSetFile(Set, Name);\n"16984" let Lines = Result.split(/\\r?\\n/);\n"16985" let Headers, Data, DataSorted;\n"16986" let Columns = 0;\n"16987" for(let i = 0; i < Lines.length; ++i)\n"16988" {\n"16989" let LineData = ParseCSVLine(Lines[i]);\n"16990" if(i == 0)\n"16991" {\n"16992" Headers = LineData;\n"16993" Columns = Headers.length;\n"16994"\n"16995" Data = new Array(Columns);\n"16996" DataSorted = new Array(Columns);\n"16997" File.Data = Data;\n"16998" File.DataSorted = DataSorted;\n"16999" for(let j = 0; j < Columns; ++j)\n"17000" {\n"17001" Data[j] = new Array();\n"17002" DataSorted[j] = new Array();\n"17003"\n"17004" let ColumnName = Headers[j];\n"17005" File.ColumnToIndex[Headers[j]] = j;\n"17006" File.Columns[ColumnName] = Data[j];\n"17007" File.ColumnsSorted[ColumnName] = DataSorted[j];\n"17008" Set.ColumnNames[ColumnName] = 1;\n"17009" }\n"17010" }\n"17011" else\n"17012" {\n"17013" if(LineData.length != Columns)\n"17014" {\n"17015" console.error(\"Failed to parse csv file \", Name);\n"17016" Set.PendingCount--;\n"17017" Set.FinishedCount--;\n"17018" ParseCSVCheckFinished(Set.Name);\n"17019" debugger;\n"17020"\n"17021" }\n"17022" for(let j = 0; j < Columns; ++j)\n"17023" {\n"17024" Data[j].push(parseFloat(LineData[j]));\n"17025" DataSorted[j].push(parseFloat(LineData[j]));\n"17026" }\n"17027" }\n"17028" }\n"17029" for(let j = 0; j < Columns; ++j)\n"17030" {\n"17031" DataSorted[j].sort();\n"17032"\n"17033" }\n"17034" Set.Files[Name] = File;\n"17035" Set.FinishedCount++;\n"17036" ParseCSVCheckFinished(Set.Name);\n"17037"\n"17038"}\n"17039"\n"17040"function ReadCSVFile(Set, File)\n"17041"{\n"17042" if(!File)\n"17043" return;\n"17044" let Reader = new FileReader();\n"17045" Reader.onload = function(e) {\n"17046" ParseCSVFile(Set, e.target.result, File.name);\n"17047" };\n"17048" Reader.onprogress = function(e)\n"17049" {\n"17050" var m = e.loaded + \":\" + e.total + \" :: \" + e.lengthComputable;\n"17051" console.log(m);\n"17052" };\n"17053" Set.PendingCount++;\n"17054" Reader.readAsText(File);\n"17055"\n"17056"}\n"17057"\n"17058"// magic from stack-overflow somewhere..\n"17059"function WindowDragEnter(e)\n"17060"{\n"17061" LastDropTarget = e.target;\n"17062" document.querySelector(\".dropzone\").style.visibility = \"\";\n"17063" document.querySelector(\".dropzone\").style.opacity = 1;\n"17064"};\n"17065"\n"17066"function WindowDragLeave(e)\n"17067"{\n"17068" if(e.target === LastDropTarget || e.target === document)\n"17069" {\n"17070" document.querySelector(\".dropzone\").style.visibility = \"hidden\";\n"17071" document.querySelector(\".dropzone\").style.opacity = 0;\n"17072" }\n"17073"};\n"17074"function DropHandler(ev)\n"17075"{\n"17076" document.querySelector(\".dropzone\").style.visibility = \"hidden\";\n"17077" document.querySelector(\".dropzone\").style.opacity = 0;\n"17078" LastDropTarget = null;\n"17079"\n"17080" let Set = CreateCSVSet();\n"17081" Set.PendingCount++;\n"17082" CSVSets[Set.Name] = Set;\n"17083" for(let i = 0; i < ev.dataTransfer.files.length; ++i)\n"17084" {\n"17085" let File = ev.dataTransfer.files[i];\n"17086" let Name = File.name;\n"17087" let ExtMatch = Name.match(/\\.[0-9a-zA-Z]+$/);\n"17088" let Ext = ExtMatch ? ExtMatch[0] : \"\";\n"17089" if(Ext.toLowerCase() == \".csv\")\n"17090" {\n"17091" ReadCSVFile(Set, File);\n"17092" }\n"17093" else\n"17094" {\n"17095" console.log(\"Not a .csv file!\\n\" + Name);\n"17096" }\n"17097" }\n"17098" if(0 == Set.PendingCount)\n"17099" {\n"17100" window.alert(\"No dropped CSV files. Please drop one or more csv files to use csv viewer\");\n"17101" }\n"17102" Set.FinishedCount++;\n"17103" ParseCSVCheckFinished(Set.Name);\n"17104" ev.preventDefault();\n"17105"}\n"17106"\n"17107"function DragOverHandler(ev)\n"17108"{\n"17109" ev.preventDefault();\n"17110"}\n"17111"\n"17112"if (\"serviceWorker\" in navigator) {\n"17113" navigator.serviceWorker.register(\"service-worker.js\")\n"17114" .then(() => console.log(\"Service Worker registered\"))\n"17115" .catch(err => console.error(\"SW registration failed\", err));\n"17116"}\n"17117"\n"17118"ReadCookie();\n"17119"ParseUrl();\n"17120"ResizeCanvas();\n"17121"SetupEvents();\n"17122"InitMenu();\n"17123"window.addEventListener(\"dragenter\", WindowDragEnter);\n"17124"window.addEventListener(\"dragleave\", WindowDragLeave);\n"17125"setInterval(Connect, 100);\n"17126"RequestDraw();\n"17127"\n"17128"\n"17129"</script>\n"17130"</body>\n"17131"</html>\n"17132"";1713317134const size_t g_MicroProfileHtmlLive_begin_5_size = sizeof(g_MicroProfileHtmlLive_begin_5);17135const char* g_MicroProfileHtmlLive_begin[] = {17136&g_MicroProfileHtmlLive_begin_0[0],17137&g_MicroProfileHtmlLive_begin_1[0],17138&g_MicroProfileHtmlLive_begin_2[0],17139&g_MicroProfileHtmlLive_begin_3[0],17140&g_MicroProfileHtmlLive_begin_4[0],17141&g_MicroProfileHtmlLive_begin_5[0],17142};17143size_t g_MicroProfileHtmlLive_begin_sizes[] = {17144sizeof(g_MicroProfileHtmlLive_begin_0),17145sizeof(g_MicroProfileHtmlLive_begin_1),17146sizeof(g_MicroProfileHtmlLive_begin_2),17147sizeof(g_MicroProfileHtmlLive_begin_3),17148sizeof(g_MicroProfileHtmlLive_begin_4),17149sizeof(g_MicroProfileHtmlLive_begin_5),17150};17151size_t g_MicroProfileHtmlLive_begin_count = 6;17152const char* g_MicroProfileHtmlLive_end[] = {17153""};17154size_t g_MicroProfileHtmlLive_end_sizes[] = {171550};17156size_t g_MicroProfileHtmlLive_end_count = 0;17157#endif //MICROPROFILE_EMBED_HTML1715817159///end file generated from microprofilelive.html171601716117162