Index: tools/binary_size/template/index.html |
diff --git a/tools/binary_size/template/index.html b/tools/binary_size/template/index.html |
index b73958a17e0d6e77ddd6cc414f9ef882c51dd131..b3a86ad5075da5d114f35ec650482ca1073be258 100644 |
--- a/tools/binary_size/template/index.html |
+++ b/tools/binary_size/template/index.html |
@@ -1,4 +1,3 @@ |
-<!DOCTYPE html> |
<!-- |
Copyright 2014 The Chromium Authors. All rights reserved. |
Use of this source code is governed by a BSD-style license that can be |
@@ -6,185 +5,521 @@ |
--> |
<html> |
<head> |
- <title>Binary Size Analysis</title> |
- <link rel='stylesheet' href='webtreemap/webtreemap.css'> |
- <style> |
- body { font-family: sans-serif; } |
- tt, pre { font-family: WebKitWorkaround, monospace; } |
- #map { |
- margin: 0 auto; |
- position: relative; |
- cursor: pointer; |
- -webkit-user-select: none; |
- } |
- #table { |
- border: 1px solid black; |
- } |
- .treemaplegend { |
- margin: 0 auto; |
- position: relative; |
- } |
- .webtreemap-symbol-vtable { |
- background: #FFFFAA; |
- } |
- .webtreemap-node:hover { |
- border-color: red; |
- background: linear-gradient(rgb(240,240,200), rgb(180,180,200)); |
- } |
- </style> |
- <script src='webtreemap/webtreemap.js'></script> |
- <script src='treemap-dump.js'></script> |
- <script src='largest-symbols.js'></script> |
- <script src='largest-sources.js'></script> |
- <script src='largest-vtables.js'></script> |
-</head> |
-<body onload='show_report_treemap()'> |
-<div style='text-align: center; margin-bottom: 2em;'> |
- <h1>Binary Size Analysis</h1> |
- <a href='#' onclick='show_report_treemap()'>Spatial Treemap</a> |
- ~ |
- <a href='#' onclick='show_report_largest_sources()'>Largest Sources</a> |
- ~ |
- <a href='#' onclick='show_report_largest_symbols()'>Largest Symbols</a> |
- ~ |
- <a href='#' onclick='show_report_largest_vtables()'>Largest VTables</a> |
-</div> |
-<div id='report'></div> |
+<title>Binary Size Analysis</title> |
+<script src="d3/d3.js" charset="utf-8"></script> |
+<script src="D3SymbolTreeMap.js" charset="utf-8"></script> |
+<script src="data.js" charset="utf-8"></script> |
+<style> |
+body { |
+ margin: 0px; |
+ padding: 5px; |
+} |
+.swatch { |
+ border: 1px solid rgb(100,100,100); |
+ -webkit-user-select: none; |
+ cursor: default; |
+} |
+</style> |
<script> |
-function escape(str) { |
- return str.replace(/&/g, '&') |
- .replace(/"/g, '"') |
- .replace(/</g, '<') |
- .replace(/>/g, '>'); |
-} |
- |
-var treemap_width = 800; |
-var treemap_height = 450; |
-function show_report_treemap() { |
- console.log('displaying treemap') |
- var div = document.getElementById('report'); |
- var w = window.treemap_width; |
- var h = window.treemap_height; |
- div.innerHTML = '<div style=\'text-align: center;\'>' + |
- '<button onclick=\'zoomInTreemap()\'>Bigger (More Detail)</button>' + |
- ', <button onclick=\'zoomOutTreemap()\'>Smaller (Less Detail)</button>' + |
- ' or resize to: ' + |
- '<input type=text size=5 id=treemap_width value=' + w + '>x' + |
- '<input type=text size=5 id=treemap_height value=' + h + '>' + |
- '<button onclick=\'resizeTreemap()\'>Go</button>' + |
- '<br><em>Click on a box to zoom in and reveal more detail. ' + |
- 'Click on the outermost box to zoom out.</em>' + |
- '<br>Legend: <table border=1 class=\'treemaplegend\' cellborder=1><tr>' + |
- '<td class=\'webtreemap-symbol-bss\'>BSS</td>' + |
- '<td class=\'webtreemap-symbol-data\'>Data</td>' + |
- '<td class=\'webtreemap-symbol-code\'>Code</td>' + |
- '<td class=\'webtreemap-symbol-read-only_data\'>RO Data</td>' + |
- '<td class=\'webtreemap-symbol-weak_symbol\'>Weak</td>' + |
- '<td class=\'webtreemap-symbol-vtable\'>VTable</td>' + |
- '</tr></table>' + |
- '<br>' + |
- '<div id=\'map\' ' + |
- 'style=\'width: ' + w + 'px; height: ' + h + 'px;\'>' + |
- '</div></div>'; |
- var map = document.getElementById('map'); |
- appendTreemap(map, kTree); |
-} |
- |
-function zoomInTreemap() { |
- window.treemap_width = Math.round(window.treemap_width * 1.25); |
- window.treemap_height = Math.round(window.treemap_height * 1.25); |
- show_report_treemap(); |
-} |
- |
-function zoomOutTreemap() { |
- window.treemap_width = Math.round(window.treemap_width / 1.25); |
- window.treemap_height = Math.round(window.treemap_height / 1.25); |
- show_report_treemap(); |
-} |
- |
-function resizeTreemap() { |
- window.treemap_width = document.getElementById('treemap_width').value; |
- window.treemap_height = document.getElementById('treemap_height').value; |
- show_report_treemap(); |
-} |
- |
-function show_report_largest_symbols() { |
- console.log('displaying largest-symbols report') |
- var div = document.getElementById('report'); |
- div.innerHTML = '<div><table id=\'list\' border=1><tr>' + |
- '<th>Rank</th><th>Size</th><th>Type</th><th>Source</th>' + |
- '</tr></table>'; |
- var list = document.getElementById('list'); |
- for (var i = 0; i < largestSymbols.length; i++) { |
- var record = largestSymbols[i]; |
- var link; |
- if (record.location.indexOf('out') == 0) { |
- link = record.location; |
+var treemap; |
+var filterChanging = false; |
+var savedSettings = {}; |
+ |
+function init() { |
+ if (window.metadata !== undefined && window.metadata.subtitle) { |
+ document.getElementById('subtitle').innerHTML = ': ' + escape(metadata.subtitle); |
+ } |
+ initFilterOptions(); |
+ treemap = new D3SymbolTreeMap( |
+ savedSettings.width, |
+ savedSettings.height, |
+ savedSettings.maxLevels); |
+ treemap.init(); |
+} |
+ |
+function getIdealSizes() { |
+ var width = window.innerWidth - 20; |
+ var height = window.innerHeight - 70; |
+ return {'width': width, 'height': height}; |
+} |
+ |
+function showReport(title, data, headers, dataFunction, styleFunction) { |
+ var div = d3.select('body').append('div') |
+ .style('margin', '0') |
+ .style('padding', '5px') |
+ .style('position', 'absolute') |
+ .style('top', '10%') |
+ .style('left', '10%') |
+ .style('background-color', 'rgba(255,255,255,0.9)') |
+ .style('width', '80%') |
+ .style('height', '80%') |
+ .style('z-index', '2147483647') |
+ .style('border', '3px ridge grey') |
+ .style('box-shadow', '10px 10px 5px rgba(80,80,80,0.7)') |
+ .style('text-align', 'center') |
+ .style('border-radius', '10px'); |
+ var titlebar = div.append('div') |
+ .style('margin', '0') |
+ .style('padding', '5px') |
+ .style('position', 'absolute') |
+ .style('top', '0%') |
+ .style('left', '0%') |
+ .style('width', '100%') |
+ .style('height', '10%') |
+ .style('font-size', 'x-large'); |
+ titlebar.text(title); |
+ var controls = div.append('div') |
+ .style('margin', '0') |
+ .style('padding', '5px') |
+ .style('position', 'absolute') |
+ .style('top', '90%') |
+ .style('left', '0%') |
+ .style('width', '100%') |
+ .style('height', '10%'); |
+ controls.append('input').attr('type', 'button') |
+ .attr('value', 'Dismiss') |
+ .on('click', function(){div.remove();}); |
+ |
+ var tableDiv = div.append('div') |
+ .style('overflow', 'auto') |
+ .style('position', 'absolute') |
+ .style('top', '10%') |
+ .style('left', '0%') |
+ .style('width', '100%') |
+ .style('height', '80%') |
+ .style('border-top', '1px solid rgb(230,230,230)') |
+ .style('border-bottom', '1px solid rgb(230,230,230)'); |
+ var table = tableDiv.append('table') |
+ .attr('border', '1') |
+ .attr('cellspacing', '0') |
+ .attr('cellpadding', '2') |
+ .style('margin-left', 'auto') |
+ .style('margin-right', 'auto'); |
+ var header = table.append('tr'); |
+ for (var i = 0; i < headers.length; i++) { |
+ header.append('th').text(headers[i]); |
+ } |
+ |
+ for (var i = 0; i < data.length; i++) { |
+ var row = table.append('tr'); |
+ for (j = 0; j < headers.length; j++) { |
+ var td = row.append('td'); |
+ if (styleFunction) { |
+ styleFunction.call(this, td, j); |
+ } |
+ dataFunction.call(this, data[i], j, td); |
+ } |
+ } |
+} |
+ |
+function bigSymbolsReport() { |
+ var list = treemap.biggestSymbols(100); |
+ var headers = ['Rank', 'Size (Bytes)', 'Type', 'Location']; |
+ var styleFunction = function(selection, index) { |
+ if (index === 3) { |
+ selection.style('font-family', 'monospace'); |
+ } |
+ }; |
+ var recordIndex = 1; |
+ var dataFunction = function(record, index, cell) { |
+ if (index === 0) { |
+ cell.text(recordIndex++); |
+ } else if (index === 1) { |
+ cell.text(D3SymbolTreeMap._pretty(record.value)); |
+ } else if (index === 2) { |
+ cell.text(record.t); |
+ } else { |
+ if (treemap.pathFor(record).indexOf('/out') == 0) { |
+ cell.append('span').text(treemap.pathFor(record)); |
+ cell.append('br'); |
+ cell.append('span').text('Symbol: '); |
+ cell.append('span').text(escape(record.n)); |
+ } else { |
+ var href = 'https://code.google.com/p/chromium/codesearch#chromium/src' |
+ + treemap.pathFor(record) |
+ + '&q=' |
+ + escape(record.n); |
+ cell.append('a') |
+ .attr('href', href) |
+ .attr('target', '_blank') |
+ .text(escape(treemap.pathFor(record))); |
+ cell.append('br'); |
+ cell.append('span').text('Symbol: '); |
+ cell.append('span').text(escape(record.n)); |
+ } |
+ } |
+ }; |
+ showReport('100 Largest Symbols', list, headers, dataFunction, styleFunction); |
+} |
+ |
+function bigPathsReport() { |
+ var list = treemap.biggestPaths(100); |
+ var headers = ['Rank', 'Size (Bytes)', 'Location']; |
+ var styleFunction = function(selection, index) { |
+ if (index === 2) { |
+ selection.style('font-family', 'monospace'); |
+ } |
+ }; |
+ var recordIndex = 1; |
+ var dataFunction = function(record, index, cell) { |
+ if (index === 0) { |
+ cell.text(recordIndex++); |
+ } else if (index === 1) { |
+ cell.text(D3SymbolTreeMap._pretty(record.value)); |
+ } else if (index === 2) { |
+ if (treemap.pathFor(record).indexOf('/out') == 0) { |
+ cell.text(treemap.pathFor(record)); |
+ } else { |
+ var href = 'https://code.google.com/p/chromium/codesearch#chromium/src' + treemap.pathFor(record); |
+ cell.append('a') |
+ .attr('href', href) |
+ .attr('target', '_blank') |
+ .text(escape(treemap.pathFor(record))); |
+ } |
+ |
+ } |
+ }; |
+ showReport('100 Largest Paths', list, headers, dataFunction, styleFunction); |
+} |
+ |
+function symbolFilterTextChanged() { |
+ if (filterChanging) return true; |
+ filterChanging = true; |
+ var enabled = document.getElementById('symbol_types_filter').value; |
+ for (var x=0; x<=25; x++) { |
+ var checkBox = document.getElementById('check_' + x); |
+ checkBox.checked = (enabled.indexOf(checkBox.value) != -1); |
+ } |
+ filterChanging = false; |
+} |
+ |
+function updateFilterText() { |
+ if (filterChanging) return true; |
+ filterChanging = true; |
+ var text = ''; |
+ for (var x=0; x<=25; x++) { |
+ var checkBox = document.getElementById('check_' + x); |
+ if (checkBox.checked) { |
+ text += checkBox.value; |
+ } |
+ } |
+ document.getElementById('symbol_types_filter').value=text; |
+ filterChanging = false; |
+} |
+ |
+function initFilterOptions() { |
+ updateFilterText(); |
+ for (var x=0; x<=25; x++) { |
+ var checkBox = document.getElementById('check_' + x); |
+ checkBox.onchange=updateFilterText; |
+ var swatch = document.getElementById('swatch_' + x); |
+ swatch.style.backgroundColor = D3SymbolTreeMap.getColorForType(checkBox.value).toString(); |
+ } |
+ var gteCheckbox = document.getElementById('check_gte'); |
+ gteCheckbox.onchange = function() { |
+ document.getElementById('symbol_filter_gte').disabled = !gteCheckbox.checked; |
+ } |
+ var regexCheckbox = document.getElementById('check_regex'); |
+ regexCheckbox.onchange = function() { |
+ document.getElementById('symbol_filter_regex').disabled = !regexCheckbox.checked; |
+ } |
+ var excludeRegexCheckbox = document.getElementById('check_exclude_regex'); |
+ excludeRegexCheckbox.onchange = function() { |
+ document.getElementById('symbol_filter_exclude_regex').disabled = !excludeRegexCheckbox.checked; |
+ } |
+ var idealSizes = getIdealSizes(); |
+ document.getElementById('width').value = idealSizes.width; |
+ document.getElementById('height').value = idealSizes.height; |
+ saveFilterSettings(); |
+} |
+ |
+function filterSetAll(enabled) { |
+ for (var x=0; x<=25; x++) { |
+ var checkBox = document.getElementById('check_' + x); |
+ checkBox.checked = enabled; |
+ } |
+ updateFilterText(); |
+} |
+ |
+function showOptions() { |
+ loadFilterSettings(); |
+ var container = document.getElementById('options_container'); |
+ var w = container.offsetWidth; |
+ var h = container.offsetHeight; |
+ container.style.margin = '-' + (h/2) + 'px 0 0 -' + (w/2) + 'px'; |
+ container.style.visibility = 'visible'; |
+} |
+ |
+function hideOptions() { |
+ var container = document.getElementById('options_container'); |
+ container.style.visibility = 'hidden'; |
+} |
+ |
+function applySettings() { |
+ hideOptions(); |
+ var oldWidth = savedSettings.width; |
+ var oldHeight = savedSettings.height; |
+ var oldSymbols = savedSettings.symbolTypes; |
+ var oldRegex = savedSettings.regex; |
+ var oldExcludeRegex = savedSettings.excludeRegex; |
+ var oldGte = savedSettings.gte; |
+ var oldMaxLevels = savedSettings.maxLevels; |
+ saveFilterSettings(); |
+ var resizeNeeded = oldWidth !== savedSettings.width || oldHeight !== savedSettings.height; |
+ var regexChanged = oldRegex !== savedSettings.regex; |
+ var excludeRegexChanged = oldExcludeRegex !== savedSettings.excludeRegex; |
+ var symbolsChanged = oldSymbols !== savedSettings.symbolTypes; |
+ var gteChanged = oldGte !== savedSettings.gte; |
+ var filterChanged = regexChanged || excludeRegexChanged || symbolsChanged || gteChanged; |
+ var maxLevelsChanged = oldMaxLevels !== savedSettings.maxLevels; |
+ |
+ if (filterChanged) { |
+ // Type filters |
+ typeFilter = function(datum) { |
+ if (datum.depth === 0) return true; // root node |
+ if (datum.t === undefined) return true; |
+ return savedSettings.symbolTypes !== undefined && |
+ savedSettings.symbolTypes.indexOf(datum.t) !== -1; |
+ } |
+ |
+ // Regex filter |
+ var regexFilter = undefined; |
+ if (savedSettings.regex !== undefined && savedSettings.regex.length > 0) { |
+ console.log('filter: regex is "' + savedSettings.regex + '"'); |
+ var regex = new RegExp(savedSettings.regex); |
+ regexFilter = function(datum) { |
+ if (datum.depth === 0) return true; // root node |
+ var fullName = this.pathFor(datum); |
+ if (datum.children === undefined) { // it is a leaf node (symbol) |
+ fullName += ':' + datum.n; |
+ } |
+ return regex.test(fullName); |
+ } |
+ } |
+ |
+ // Exclude regex filter |
+ var excludeRegexFilter = undefined; |
+ if (savedSettings.excludeRegex !== undefined && savedSettings.excludeRegex.length > 0) { |
+ console.log('filter: exclude-regex is "' + savedSettings.excludeRegex + '"'); |
+ var excludeRegex = new RegExp(savedSettings.excludeRegex); |
+ excludeRegexFilter = function(datum) { |
+ if (datum.depth === 0) return true; // root node |
+ var fullName = this.pathFor(datum); |
+ if (datum.children === undefined) { // it is a leaf node (symbol) |
+ fullName += ':' + datum.n; |
+ } |
+ return !excludeRegex.test(fullName); |
+ } |
+ } |
+ |
+ // Size filter |
+ var sizeFilter = undefined; |
+ if (savedSettings.gte !== undefined) { |
+ console.log('filter: minimum size is ' + savedSettings.gte + ' bytes'); |
+ sizeFilter = function(datum) { |
+ if (datum.children !== undefined) return true; // non-leaf |
+ if (datum.value === undefined) console.log('whoops'); |
+ return datum.value >= savedSettings.gte; |
+ } |
+ } |
+ |
+ // Make a filter to apply to the tree |
+ var filter = function(datum) { |
+ if (typeFilter && !typeFilter.call(this, datum)) return false; |
+ if (regexFilter && !regexFilter.call(this, datum)) return false; |
+ if (excludeRegexFilter && !excludeRegexFilter.call(this, datum)) return false; |
+ if (sizeFilter && !sizeFilter.call(this, datum)) return false; |
+ return true; |
+ }; |
+ treemap.filter(filter); |
+ } |
+ |
+ // Adjust levels if needed. |
+ if (maxLevelsChanged) { |
+ treemap.setMaxLevels(savedSettings.maxLevels); |
+ } |
+ |
+ // Resize map if necessary. |
+ if (resizeNeeded) { |
+ console.log('desired treemap dimensions have changed, requesting resize'); |
+ treemap.resize(savedSettings.width, savedSettings.height); |
+ } |
+} |
+ |
+function cancelSettings() { |
+ hideOptions(); |
+ loadFilterSettings(); |
+} |
+ |
+function saveFilterSettings() { |
+ savedSettings.symbolTypes = document.getElementById('symbol_types_filter').value; |
+ if (document.getElementById('check_regex').checked) { |
+ savedSettings.regex = document.getElementById('symbol_filter_regex').value; |
} else { |
- link = '<a href="https://code.google.com/p/chromium/codesearch#chromium/src/' |
- + record.location + '">' + escape(record.location) + '</a>'; |
- } |
- list.innerHTML += '<tr>' |
- + '<td>' + (i+1) + '</td>' |
- + '<td>' + escape(record.size) + '</td>' |
- + '<td style=\'white-space: nowrap;\'>' + escape(record.type) + '</td>' |
- + '<td>' + link + ':<br>' |
- + escape(record.symbol) + '</td>' |
- + '</tr>'; |
- } |
-} |
- |
-function show_report_largest_sources() { |
- console.log('displaying largest-sources report') |
- var div = document.getElementById('report'); |
- div.innerHTML = '<div><table id=\'list\' border=1><tr>' + |
- '<th>Rank</th><th>Size</th><th>Symbol Count</th><th>Source</th>' + |
- '</tr></table>'; |
- var list = document.getElementById('list'); |
- for (var i = 0; i < largestSources.length; i++) { |
- var record = largestSources[i]; |
- var link; |
- if (record.location.indexOf('out') == 0) { |
- link = record.location; |
+ savedSettings.regex = undefined; |
+ } |
+ if (document.getElementById('check_exclude_regex').checked) { |
+ savedSettings.excludeRegex = document.getElementById('symbol_filter_exclude_regex').value; |
} else { |
- link = '<a href="https://code.google.com/p/chromium/codesearch#chromium/src/' |
- + record.location + '">' + escape(record.location) + '</a>'; |
- } |
- |
- list.innerHTML += '<tr>' |
- + '<td>' + (i+1) + '</td>' |
- + '<td>' + escape(record.size) + '</td>' |
- + '<td>' + escape(record.symbol_count) + '</td>' |
- + '<td>' + link + '</td>' |
- + '</tr>'; |
- } |
-} |
- |
-function show_report_largest_vtables() { |
- console.log('displaying largest-vtables report') |
- var div = document.getElementById('report'); |
- div.innerHTML = '<div><table id=\'list\' border=1><tr>' + |
- '<th>Rank</th><th>Size</th><th>Symbol</th><th>Source</th>' + |
- '</tr></table>'; |
- var list = document.getElementById('list'); |
- for (var i = 0; i < largestVTables.length; i++) { |
- var record = largestVTables[i]; |
- var link; |
- if (record.location.indexOf('out') == 0) { |
- link = record.location; |
+ savedSettings.excludeRegex = undefined; |
+ } |
+ if (document.getElementById('check_gte').checked) { |
+ savedSettings.gte = parseInt(document.getElementById('symbol_filter_gte').value); |
} else { |
- link = '<a href="https://code.google.com/p/chromium/codesearch#chromium/src/' |
- + record.location + '">' + escape(record.location) + '</a>'; |
+ savedSettings.gte = undefined; |
} |
+ savedSettings.width = parseInt(document.getElementById('width').value); |
+ savedSettings.height = parseInt(document.getElementById('height').value); |
+ savedSettings.maxLevels = parseInt(document.getElementById('max_levels').value); |
+} |
- list.innerHTML += '<tr>' |
- + '<td>' + (i+1) + '</td>' |
- + '<td>' + escape(record.size) + '</td>' |
- + '<td>' + escape(record.symbol) + '</td>' |
- + '<td>' + link + '</td>' |
- + '</tr>'; |
- } |
+function loadFilterSettings() { |
+ document.getElementById('symbol_types_filter').value = savedSettings.symbolTypes; |
+ symbolFilterTextChanged(); |
+ if (savedSettings.regex !== undefined) { |
+ document.getElementById('check_regex').checked = true; |
+ document.getElementById('symbol_filter_regex').value = savedSettings.regex; |
+ } else { |
+ document.getElementById('check_regex').checked = false; |
+ } |
+ if (savedSettings.excludeRegex !== undefined) { |
+ document.getElementById('check_exclude_regex').checked = true; |
+ document.getElementById('symbol_filter_exclude_regex').value = savedSettings.excludeRegex; |
+ } else { |
+ document.getElementById('check_exclude_regex').checked = false; |
+ } |
+ if (savedSettings.gte !== undefined) { |
+ document.getElementById('check_gte').checked = true; |
+ document.getElementById('symbol_filter_gte').value = savedSettings.gte; |
+ } else { |
+ document.getElementById('check_gte').checked = false; |
+ } |
+ document.getElementById('width').value = savedSettings.width; |
+ document.getElementById('height').value = savedSettings.height; |
+ document.getElementById('max_levels').value = savedSettings.maxLevels; |
+} |
+ |
+function escape(str) { |
+ return str.replace(/&/g, '&') |
+ .replace(/"/g, '"') |
+ .replace(/</g, '<') |
+ .replace(/>/g, '>'); |
} |
</script> |
+</head> |
+<body onload='init()'> |
+<div style='position: absolute; top: 5px; left: 5px;'> |
+ <input type='button' onclick='showOptions()' value='Options & Legend...'> |
+ <span style='-webkit-user-select: none; cursor: help;' title='Click to view the symbol legend or to configure filters and options for the treemap'>[?]</span> |
+</div> |
+<div style='position: absolute; right: 5px; top: 5px; white-space: nowrap;'> |
+ Reports: |
+ <input type='button' onclick='bigSymbolsReport()' value='Large Symbols' title='Click to view a report of the largest 100 symbols that are with the bounds of the treemap that is currently displayed.'> |
+ <input type='button' onclick='bigPathsReport()' value='Large Files' title='Click to view a report of the largest 100 source files that are with the bounds of the treemap that is currently displayed.'> |
+</div> |
+<div style='text-align: center; margin-bottom: 5px;'> |
+ <span style='font-size: x-large; font-weight: bold; font-variant: small-caps'>Binary Size Analysis<span id='subtitle'></span></span> |
+ <br><span style='font-size: small; font-style: italic;'>Double-click a box to zoom in, double-click outermost title to zoom out.</span> |
+</div> |
+<table id='options_container' style='visibility: hidden; border: 3px ridge grey; padding: 0px; top: 50%; left: 50%; position: fixed; z-index: 2147483646; overflow: auto; background-color: rgba(255,255,255,0.9); border-radius: 10px; box-shadow: 10px 10px 5px rgba(80,80,80,0.7);'><tr><td style='vertical-align: top'> |
+ <table cellspacing=0 cellborder=0 style='width:100%'> |
+ <tr><th colspan=3 style='padding-bottom: .25em; text-decoration: underline;'>Symbol Types To Show</th></tr> |
+ <tr> |
+ <td style='width: 33%; white-space: nowrap; vertical-align: top;'> |
+ <span class='swatch' id='swatch_0'> </span><input checked type='checkbox' id='check_0' value='A'>Global absolute (A) |
+ <br><span class='swatch' id='swatch_1'> </span><input checked type='checkbox' id='check_1' value='B'>Global uninitialized data (B) |
+ <br><span class='swatch' id='swatch_2'> </span><input checked type='checkbox' id='check_2' value='b'>Local uninitialized data (b) |
+ <br><span class='swatch' id='swatch_3'> </span><input checked type='checkbox' id='check_3' value='C'>Global uninitialized common (C) |
+ <br><span class='swatch' id='swatch_4'> </span><input checked type='checkbox' id='check_4' value='D'>Global initialized data (D) |
+ <br><span class='swatch' id='swatch_5'> </span><input checked type='checkbox' id='check_5' value='d'>Local initialized data (d) |
+ <br><span class='swatch' id='swatch_6'> </span><input checked type='checkbox' id='check_6' value='G'>Global small initialized data (G) |
+ <br><span class='swatch' id='swatch_7'> </span><input checked type='checkbox' id='check_7' value='g'>Local small initialized data (g) |
+ <br><span class='swatch' id='swatch_8'> </span><input checked type='checkbox' id='check_8' value='i'>Indirect function (i) |
+ </td> |
+ <td style='width: 33%; white-space: nowrap; vertical-align: top;'> |
+ <span class='swatch' id='swatch_9'> </span><input checked type='checkbox' id='check_9' value='N'>Debugging (N) |
+ <br><span class='swatch' id='swatch_10'> </span><input checked type='checkbox' id='check_10' value='p'>Stack unwind (p) |
+ <br><span class='swatch' id='swatch_11'> </span><input checked type='checkbox' id='check_11' value='R'>Global read-only data (R) |
+ <br><span class='swatch' id='swatch_12'> </span><input checked type='checkbox' id='check_12' value='r'>Local read-only data (r) |
+ <br><span class='swatch' id='swatch_13'> </span><input checked type='checkbox' id='check_13' value='S'>Global small uninitialized data (S) |
+ <br><span class='swatch' id='swatch_14'> </span><input checked type='checkbox' id='check_14' value='s'>Local small uninitialized data (s) |
+ <br><span class='swatch' id='swatch_15'> </span><input checked type='checkbox' id='check_15' value='T'>Global code (T) |
+ <br><span class='swatch' id='swatch_16'> </span><input checked type='checkbox' id='check_16' value='t'>Local code (t) |
+ <br><span class='swatch' id='swatch_17'> </span><input checked type='checkbox' id='check_17' value='U'>Undefined (U) |
+ </td> |
+ <td style='width: 33%; white-space: nowrap; vertical-align: top;'> |
+ <span class='swatch' id='swatch_18'> </span><input checked type='checkbox' id='check_18' value='u'>Unique (u) |
+ <br><span class='swatch' id='swatch_19'> </span><input checked type='checkbox' id='check_19' value='V'>Global weak object (V) |
+ <br><span class='swatch' id='swatch_20'> </span><input checked type='checkbox' id='check_20' value='v'>Local weak object (v) |
+ <br><span class='swatch' id='swatch_21'> </span><input checked type='checkbox' id='check_21' value='W'>Global weak symbol (W) |
+ <br><span class='swatch' id='swatch_22'> </span><input checked type='checkbox' id='check_22' value='w'>Local weak symbol (w) |
+ <br><span class='swatch' id='swatch_23'> </span><input checked type='checkbox' id='check_23' value='@'>Vtable entry (@) |
+ <br><span class='swatch' id='swatch_24'> </span><input checked type='checkbox' id='check_24' value='-'>STABS debugging (-) |
+ <br><span class='swatch' id='swatch_25'> </span><input checked type='checkbox' id='check_25' value='?'>Unrecognized (?) |
+ </td> |
+ </tr> |
+ <tr><td colspan=3 style='text-align: center; white-space: nowrap; padding-top: 1em;'> |
+ Select <input type='button' onclick='filterSetAll(true)' value='All'>, |
+ <input type='button' onclick='filterSetAll(false)' value='None'>, |
+ or type a string: <input id='symbol_types_filter' size=30 value='' onkeyup='symbolFilterTextChanged()' onblur='updateFilterText()'> |
+ <span style='-webkit-user-select: none; cursor: help;' title='Enter codes from the list above for the symbols you want to see. The checkboxes will update automatically to match the string that you enter.'>[?]</span> |
+ </td></tr> |
+ </table> |
+</td></tr><tr><td style='vertical-align: top; padding-top: 10px; border-top: 1px solid grey;'> |
+ <table cellspacing=0 cellborder=0 style='width: 100%'> |
+ <tr><th colspan=2 style='padding-bottom: .25em; text-decoration: underline;'>Advanced Options</th></tr> |
+ <tr> |
+ <td style='white-space: nowrap; vertical-align: top;'> |
+ <input type='checkbox' id='check_regex'> |
+ Only include symbols matching this regex: |
+ </td> |
+ <td style='text-align: right; vertical-align: top;'> |
+ <input disabled id='symbol_filter_regex' size=30 value='' style='text-align: right;'> |
+ <span style='-webkit-user-select: none; cursor: help;' title='Enter a javascript regex. Only symbols that match this regex will be shown. This filter applies before any exclusion regex specified below. The format of each symbol is [path]:[symbol_name]'>[?]</span> |
+ </td> |
+ </tr> |
+ <tr> |
+ <td style='white-space: nowrap; vertical-align: top;'> |
+ <input type='checkbox' id='check_exclude_regex'> |
+ Exclude all symbols matching this regex: |
+ </td> |
+ <td style='text-align: right; vertical-align: top;'> |
+ <input disabled id='symbol_filter_exclude_regex' size=30 value='' style='text-align: right;'> |
+ <span style='-webkit-user-select: none; cursor: help;' title='Enter a javascript regex. Symbols that match this tegex will not be shown. This filter applies after any inclusion filter specified above. The format of each symbol is [path]:[symbol_name]'>[?]</span> |
+ </td> |
+ </tr> |
+ <tr> |
+ <td style='white-space: nowrap; vertical-align: top;'> |
+ <input type='checkbox' id='check_gte'> |
+ Only include symbols that are at least <span style='font-style: italic;'>n</span> bytes: |
+ </td> |
+ <td style='text-align: right; vertical-align: top;'> |
+ <input disabled id='symbol_filter_gte' size=8 value='' style='text-align: right;'> |
+ <span style='-webkit-user-select: none; cursor: help;' title='Symbols whose size is less than this value will be hidden.'>[?]</span> |
+ </td> |
+ </tr> |
+ <tr> |
+ <td style='white-space: nowrap vertical-align: top;;'> |
+ Show at most <span style='font-style: italic;'>n</span> levels of detail at a time: |
+ </td> |
+ <td style='text-align: right; vertical-align: top;'> |
+ <input id='max_levels' size=4 value='2' style='text-align: right;'><span style='-webkit-user-select: none; cursor: help;' title='Increasing this value shows more detail without the need to zoom, but uses more computing power.'>[?]</span> |
+ </td> |
+ </tr> |
+ <tr> |
+ <td style='white-space: nowrap vertical-align: top;;'> |
+ Set the size of the treemap to <span style='font-style: italic;'>W x H</span> pixels: |
+ </td> |
+ <td style='text-align: right; vertical-align: top;'> |
+ <input id='width' size=4 value='' style='text-align: right;'> |
+ x <input id='height' size=4 value='' style='text-align: right;'> |
+ </td> |
+ </tr> |
+ </table> |
+</td></tr> |
+<tr><td style='padding-top: 10px; text-align: right; border-top: 1px solid grey'> |
+ <input type='button' value='Apply' onclick='applySettings()'> |
+ <input type='button' value='Cancel' onclick='cancelSettings()'> |
+</td></tr></table> |
</body> |
-</html> |
+</html> |