diff options
Diffstat (limited to 'chromium/third_party/trace-viewer/src/cc/picture_ops_chart_summary_view.js')
-rw-r--r-- | chromium/third_party/trace-viewer/src/cc/picture_ops_chart_summary_view.js | 464 |
1 files changed, 0 insertions, 464 deletions
diff --git a/chromium/third_party/trace-viewer/src/cc/picture_ops_chart_summary_view.js b/chromium/third_party/trace-viewer/src/cc/picture_ops_chart_summary_view.js deleted file mode 100644 index f0472290387..00000000000 --- a/chromium/third_party/trace-viewer/src/cc/picture_ops_chart_summary_view.js +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -'use strict'; - -base.requireStylesheet('cc.picture_ops_chart_summary_view'); - -base.exportTo('cc', function() { - - var OPS_TIMING_ITERATIONS = 3; - var CHART_PADDING_LEFT = 65; - var CHART_PADDING_RIGHT = 40; - var AXIS_PADDING_LEFT = 60; - var AXIS_PADDING_RIGHT = 35; - var AXIS_PADDING_TOP = 25; - var AXIS_PADDING_BOTTOM = 45; - var AXIS_LABEL_PADDING = 5; - var AXIS_TICK_SIZE = 10; - var LABEL_PADDING = 5; - var LABEL_INTERLEAVE_OFFSET = 15; - var BAR_PADDING = 5; - var VERTICAL_TICKS = 5; - var HUE_CHAR_CODE_ADJUSTMENT = 5.7; - - /** - * Provides a chart showing the cumulative time spent in Skia operations - * during picture rasterization. - * - * @constructor - */ - var PictureOpsChartSummaryView = ui.define('picture-ops-chart-summary-view'); - - PictureOpsChartSummaryView.prototype = { - __proto__: HTMLUnknownElement.prototype, - - decorate: function() { - this.picture_ = undefined; - this.pictureDataProcessed_ = false; - - this.chartScale_ = window.devicePixelRatio; - - this.chart_ = document.createElement('canvas'); - this.chartCtx_ = this.chart_.getContext('2d'); - this.appendChild(this.chart_); - - this.opsTimingData_ = []; - - this.chartWidth_ = 0; - this.chartHeight_ = 0; - this.requiresRedraw_ = true; - - this.currentBarMouseOverTarget_ = null; - - this.chart_.addEventListener('mousemove', this.onMouseMove_.bind(this)); - }, - - get requiresRedraw() { - return this.requiresRedraw_; - }, - - set requiresRedraw(requiresRedraw) { - this.requiresRedraw_ = requiresRedraw; - }, - - get picture() { - return this.picture_; - }, - - set picture(picture) { - this.picture_ = picture; - this.pictureDataProcessed_ = false; - - if (this.classList.contains('hidden')) - return; - - this.processPictureData_(); - this.requiresRedraw = true; - this.updateChartContents(); - }, - - hide: function() { - this.classList.add('hidden'); - }, - - show: function() { - - this.classList.remove('hidden'); - - if (this.pictureDataProcessed_) - return; - - this.processPictureData_(); - this.requiresRedraw = true; - this.updateChartContents(); - - }, - - onMouseMove_: function(e) { - - var lastBarMouseOverTarget = this.currentBarMouseOverTarget_; - this.currentBarMouseOverTarget_ = null; - - var x = e.offsetX; - var y = e.offsetY; - - var chartLeft = CHART_PADDING_LEFT; - var chartRight = this.chartWidth_ - CHART_PADDING_RIGHT; - var chartTop = AXIS_PADDING_TOP; - var chartBottom = this.chartHeight_ - AXIS_PADDING_BOTTOM; - var chartInnerWidth = chartRight - chartLeft; - - if (x > chartLeft && x < chartRight && y > chartTop && y < chartBottom) { - - this.currentBarMouseOverTarget_ = Math.floor( - (x - chartLeft) / chartInnerWidth * this.opsTimingData_.length); - - this.currentBarMouseOverTarget_ = base.clamp( - this.currentBarMouseOverTarget_, 0, this.opsTimingData_.length - 1); - - } - - if (this.currentBarMouseOverTarget_ === lastBarMouseOverTarget) - return; - - this.drawChartContents_(); - }, - - updateChartContents: function() { - - if (this.requiresRedraw) - this.updateChartDimensions_(); - - this.drawChartContents_(); - }, - - updateChartDimensions_: function() { - this.chartWidth_ = this.offsetWidth; - this.chartHeight_ = this.offsetHeight; - - // Scale up the canvas according to the devicePixelRatio, then reduce it - // down again via CSS. Finally we apply a scale to the canvas so that - // things are drawn at the correct size. - this.chart_.width = this.chartWidth_ * this.chartScale_; - this.chart_.height = this.chartHeight_ * this.chartScale_; - - this.chart_.style.width = this.chartWidth_ + 'px'; - this.chart_.style.height = this.chartHeight_ + 'px'; - - this.chartCtx_.scale(this.chartScale_, this.chartScale_); - }, - - processPictureData_: function() { - - this.resetOpsTimingData_(); - this.pictureDataProcessed_ = true; - - if (!this.picture_) - return; - - var ops = this.picture_.getOps(); - if (!ops) - return; - - ops = this.picture_.tagOpsWithTimings(ops); - - // Check that there are valid times. - if (ops[0].cmd_time === undefined) - return; - - this.collapseOpsToTimingBuckets_(ops); - }, - - drawChartContents_: function() { - - this.clearChartContents_(); - - if (this.opsTimingData_.length === 0) { - this.showNoTimingDataMessage_(); - return; - } - - this.drawChartAxes_(); - this.drawBars_(); - this.drawLineAtBottomOfChart_(); - - if (this.currentBarMouseOverTarget_ === null) - return; - - this.drawTooltip_(); - }, - - drawLineAtBottomOfChart_: function() { - this.chartCtx_.strokeStyle = '#AAA'; - this.chartCtx_.moveTo(0, this.chartHeight_ - 0.5); - this.chartCtx_.lineTo(this.chartWidth_, this.chartHeight_ - 0.5); - this.chartCtx_.stroke(); - }, - - drawTooltip_: function() { - - var tooltipData = this.opsTimingData_[this.currentBarMouseOverTarget_]; - var tooltipTitle = tooltipData.cmd_string; - var tooltipTime = tooltipData.cmd_time.toFixed(4); - - var tooltipWidth = 110; - var tooltipHeight = 40; - var chartInnerWidth = this.chartWidth_ - CHART_PADDING_RIGHT - - CHART_PADDING_LEFT; - var barWidth = chartInnerWidth / this.opsTimingData_.length; - var tooltipOffset = Math.round((tooltipWidth - barWidth) * 0.5); - - var left = CHART_PADDING_LEFT + this.currentBarMouseOverTarget_ * - barWidth - tooltipOffset; - var top = Math.round((this.chartHeight_ - tooltipHeight) * 0.5); - - this.chartCtx_.save(); - - this.chartCtx_.shadowOffsetX = 0; - this.chartCtx_.shadowOffsetY = 5; - this.chartCtx_.shadowBlur = 4; - this.chartCtx_.shadowColor = 'rgba(0,0,0,0.4)'; - - this.chartCtx_.strokeStyle = '#888'; - this.chartCtx_.fillStyle = '#EEE'; - this.chartCtx_.fillRect(left, top, tooltipWidth, tooltipHeight); - - this.chartCtx_.shadowColor = 'transparent'; - this.chartCtx_.translate(0.5, 0.5); - this.chartCtx_.strokeRect(left, top, tooltipWidth, tooltipHeight); - - this.chartCtx_.restore(); - - this.chartCtx_.fillStyle = '#222'; - this.chartCtx_.textBaseline = 'top'; - this.chartCtx_.font = '800 12px Arial'; - this.chartCtx_.fillText(tooltipTitle, left + 8, top + 8); - - this.chartCtx_.fillStyle = '#555'; - this.chartCtx_.textBaseline = 'top'; - this.chartCtx_.font = '400 italic 10px Arial'; - this.chartCtx_.fillText('Total: ' + tooltipTime + 'ms', - left + 8, top + 22); - }, - - drawBars_: function() { - - var len = this.opsTimingData_.length; - var max = this.opsTimingData_[0].cmd_time; - var min = this.opsTimingData_[len - 1].cmd_time; - - var width = this.chartWidth_ - CHART_PADDING_LEFT - CHART_PADDING_RIGHT; - var height = this.chartHeight_ - AXIS_PADDING_TOP - AXIS_PADDING_BOTTOM; - var barWidth = Math.floor(width / len); - - var opData; - var opTiming; - var opHeight; - var opLabel; - var barLeft; - - for (var b = 0; b < len; b++) { - - opData = this.opsTimingData_[b]; - opTiming = opData.cmd_time / max; - - opHeight = Math.round(Math.max(1, opTiming * height)); - opLabel = opData.cmd_string; - barLeft = CHART_PADDING_LEFT + b * barWidth; - - this.chartCtx_.fillStyle = this.getOpColor_(opLabel); - - this.chartCtx_.fillRect(barLeft + BAR_PADDING, AXIS_PADDING_TOP + - height - opHeight, barWidth - 2 * BAR_PADDING, opHeight); - } - - }, - - getOpColor_: function(opName) { - - var characters = opName.split(''); - var hue = characters.reduce(this.reduceNameToHue, 0) % 360; - - return 'hsl(' + hue + ', 30%, 50%)'; - }, - - reduceNameToHue: function(previousValue, currentValue, index, array) { - // Get the char code and apply a magic adjustment value so we get - // pretty colors from around the rainbow. - return Math.round(previousValue + currentValue.charCodeAt(0) * - HUE_CHAR_CODE_ADJUSTMENT); - }, - - drawChartAxes_: function() { - - var len = this.opsTimingData_.length; - var max = this.opsTimingData_[0].cmd_time; - var min = this.opsTimingData_[len - 1].cmd_time; - - var width = this.chartWidth_ - AXIS_PADDING_LEFT - AXIS_PADDING_RIGHT; - var height = this.chartHeight_ - AXIS_PADDING_TOP - AXIS_PADDING_BOTTOM; - - var totalBarWidth = this.chartWidth_ - CHART_PADDING_LEFT - - CHART_PADDING_RIGHT; - var barWidth = Math.floor(totalBarWidth / len); - var tickYInterval = height / (VERTICAL_TICKS - 1); - var tickYPosition = 0; - var tickValInterval = (max - min) / (VERTICAL_TICKS - 1); - var tickVal = 0; - - this.chartCtx_.fillStyle = '#333'; - this.chartCtx_.strokeStyle = '#777'; - this.chartCtx_.save(); - - // Translate half a pixel to avoid blurry lines. - this.chartCtx_.translate(0.5, 0.5); - - // Sides. - - this.chartCtx_.save(); - - this.chartCtx_.translate(AXIS_PADDING_LEFT, AXIS_PADDING_TOP); - this.chartCtx_.moveTo(0, 0); - this.chartCtx_.lineTo(0, height); - this.chartCtx_.lineTo(width, height); - - // Y-axis ticks. - this.chartCtx_.font = '10px Arial'; - this.chartCtx_.textAlign = 'right'; - this.chartCtx_.textBaseline = 'middle'; - - for (var t = 0; t < VERTICAL_TICKS; t++) { - - tickYPosition = Math.round(t * tickYInterval); - tickVal = (max - t * tickValInterval).toFixed(4); - - this.chartCtx_.moveTo(0, tickYPosition); - this.chartCtx_.lineTo(-AXIS_TICK_SIZE, tickYPosition); - this.chartCtx_.fillText(tickVal, - -AXIS_TICK_SIZE - AXIS_LABEL_PADDING, tickYPosition); - - } - - this.chartCtx_.stroke(); - - this.chartCtx_.restore(); - - - // Labels. - - this.chartCtx_.save(); - - this.chartCtx_.translate(CHART_PADDING_LEFT + Math.round(barWidth * 0.5), - AXIS_PADDING_TOP + height + LABEL_PADDING); - - this.chartCtx_.font = '10px Arial'; - this.chartCtx_.textAlign = 'center'; - this.chartCtx_.textBaseline = 'top'; - - var labelTickLeft; - var labelTickBottom; - for (var l = 0; l < len; l++) { - - labelTickLeft = Math.round(l * barWidth); - labelTickBottom = l % 2 * LABEL_INTERLEAVE_OFFSET; - - this.chartCtx_.save(); - this.chartCtx_.moveTo(labelTickLeft, -LABEL_PADDING); - this.chartCtx_.lineTo(labelTickLeft, labelTickBottom); - this.chartCtx_.stroke(); - this.chartCtx_.restore(); - - this.chartCtx_.fillText(this.opsTimingData_[l].cmd_string, - labelTickLeft, labelTickBottom); - } - - this.chartCtx_.restore(); - - this.chartCtx_.restore(); - }, - - clearChartContents_: function() { - this.chartCtx_.clearRect(0, 0, this.chartWidth_, this.chartHeight_); - }, - - showNoTimingDataMessage_: function() { - this.chartCtx_.font = '800 italic 14px Arial'; - this.chartCtx_.fillStyle = '#333'; - this.chartCtx_.textAlign = 'center'; - this.chartCtx_.textBaseline = 'middle'; - this.chartCtx_.fillText('No timing data available.', - this.chartWidth_ * 0.5, this.chartHeight_ * 0.5); - }, - - collapseOpsToTimingBuckets_: function(ops) { - - var opsTimingDataIndexHash_ = {}; - var timingData = this.opsTimingData_; - var op; - var opIndex; - - for (var i = 0; i < ops.length; i++) { - - op = ops[i]; - - if (op.cmd_time === undefined) - continue; - - // Try to locate the entry for the current operation - // based on its name. If that fails, then create one for it. - opIndex = opsTimingDataIndexHash_[op.cmd_string] || null; - - if (opIndex === null) { - timingData.push({ - cmd_time: 0, - cmd_string: op.cmd_string - }); - - opIndex = timingData.length - 1; - opsTimingDataIndexHash_[op.cmd_string] = opIndex; - } - - timingData[opIndex].cmd_time += op.cmd_time; - - } - - timingData.sort(this.sortTimingBucketsByOpTimeDescending_); - - this.collapseTimingBucketsToOther_(4); - }, - - collapseTimingBucketsToOther_: function(count) { - - var timingData = this.opsTimingData_; - var otherSource = timingData.splice(count, timingData.length - count); - var otherDestination = null; - - if (!otherSource.length) - return; - - timingData.push({ - cmd_time: 0, - cmd_string: 'Other' - }); - - otherDestination = timingData[timingData.length - 1]; - for (var i = 0; i < otherSource.length; i++) { - otherDestination.cmd_time += otherSource[i].cmd_time; - } - }, - - sortTimingBucketsByOpTimeDescending_: function(a, b) { - return b.cmd_time - a.cmd_time; - }, - - resetOpsTimingData_: function() { - this.opsTimingData_.length = 0; - } - }; - - return { - PictureOpsChartSummaryView: PictureOpsChartSummaryView - }; -}); |