3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="stylesheet" href="/tracing/tracks/drawing_container.css">
10 <link rel="import" href="/tracing/tracks/track.html">
11 <link rel="import" href="/tvcm/raf.html">
12 <link rel="import" href="/tvcm/ui.html">
17 tvcm.exportTo('tracing.tracks', function() {
27 var DrawingContainer = tvcm.ui.define('drawing-container',
28 tracing.tracks.Track);
30 DrawingContainer.prototype = {
31 __proto__: tracing.tracks.Track.prototype,
33 decorate: function(viewport) {
34 tracing.tracks.Track.prototype.decorate.call(this, viewport);
35 this.classList.add('drawing-container');
37 this.canvas_ = document.createElement('canvas');
38 this.canvas_.className = 'drawing-container-canvas';
39 this.canvas_.style.left = tracing.constants.HEADING_WIDTH + 'px';
40 this.appendChild(this.canvas_);
42 this.ctx_ = this.canvas_.getContext('2d');
44 this.viewportChange_ = this.viewportChange_.bind(this);
45 this.viewport.addEventListener('change', this.viewportChange_);
48 // Needed to support the calls in TimelineTrackView.
57 viewportChange_: function() {
61 invalidate: function() {
64 this.rafPending_ = true;
66 tvcm.requestPreAnimationFrame(this.preDraw_, this);
69 preDraw_: function() {
70 this.rafPending_ = false;
71 this.updateCanvasSizeIfNeeded_();
73 tvcm.requestAnimationFrameInThisFrameIfPossible(this.draw_, this);
77 this.ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height);
82 DrawType.INSTANT_EVENT,
88 for (var idx in typesToDraw) {
89 for (var i = 0; i < this.children.length; ++i) {
90 if (!(this.children[i] instanceof tracing.tracks.Track))
92 this.children[i].drawTrack(typesToDraw[idx]);
96 var pixelRatio = window.devicePixelRatio || 1;
97 var bounds = this.canvas_.getBoundingClientRect();
98 var dt = this.viewport.currentDisplayTransform;
99 var viewLWorld = dt.xViewToWorld(0);
100 var viewRWorld = dt.xViewToWorld(
101 bounds.width * pixelRatio);
103 this.viewport.drawGridLines(this.ctx_, viewLWorld, viewRWorld);
106 updateCanvasSizeIfNeeded_: function() {
107 var visibleChildTracks =
108 tvcm.asArray(this.children).filter(this.visibleFilter_);
110 var thisBounds = this.getBoundingClientRect();
112 var firstChildTrackBounds = visibleChildTracks[0].getBoundingClientRect();
113 var lastChildTrackBounds =
114 visibleChildTracks[visibleChildTracks.length - 1].
115 getBoundingClientRect();
117 var innerWidth = firstChildTrackBounds.width -
118 tracing.constants.HEADING_WIDTH;
119 var innerHeight = lastChildTrackBounds.bottom - firstChildTrackBounds.top;
121 var pixelRatio = window.devicePixelRatio || 1;
122 if (this.canvas_.width != innerWidth * pixelRatio) {
123 this.canvas_.width = innerWidth * pixelRatio;
124 this.canvas_.style.width = innerWidth + 'px';
127 if (this.canvas_.height != innerHeight * pixelRatio) {
128 this.canvas_.height = innerHeight * pixelRatio;
129 this.canvas_.style.height = innerHeight + 'px';
133 visibleFilter_: function(element) {
134 if (!(element instanceof tracing.tracks.Track))
136 return window.getComputedStyle(element).display !== 'none';
139 addClosestEventToSelection: function(
140 worldX, worldMaxDist, loY, hiY, selection) {
141 for (var i = 0; i < this.children.length; ++i) {
142 if (!(this.children[i] instanceof tracing.tracks.Track))
144 var trackClientRect = this.children[i].getBoundingClientRect();
145 var a = Math.max(loY, trackClientRect.top);
146 var b = Math.min(hiY, trackClientRect.bottom);
148 this.children[i].addClosestEventToSelection(
149 worldX, worldMaxDist, loY, hiY, selection);
153 tracing.tracks.Track.prototype.addClosestEventToSelection.
154 apply(this, arguments);
157 addEventsToTrackMap: function(eventToTrackMap) {
158 for (var i = 0; i < this.children.length; ++i) {
159 if (!(this.children[i] instanceof tracing.tracks.Track))
161 this.children[i].addEventsToTrackMap(eventToTrackMap);
167 DrawingContainer: DrawingContainer,