Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: chrome/browser/resources/gpu_internals/sorted_array_utils.js

Issue 7555005: Moving the contents of chrome://gpu Profiling to chrome://tracing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5
6 /**
7 * @fileoverview Helper functions for doing intersections and iteration
8 * over sorted arrays and intervals.
9 *
10 */
11 cr.define('gpu', function() {
12 /**
13 * Finds the first index in the array whose value is >= loVal.
14 *
15 * The key for the search is defined by the mapFn. This array must
16 * be prearranged such that ary.map(mapFn) would also be sorted in
17 * ascending order.
18 *
19 * @param {Array} ary An array of arbitrary objects.
20 * @param {function():*} mapFn Callback that produces a key value
21 * from an element in ary.
22 * @param {number} loVal Value for which to search.
23 * @return {Number} Offset o into ary where all ary[i] for i <= o
24 * are < loVal, or ary.length if loVal is greater than all elements in
25 * the array.
26 */
27 function findLowIndexInSortedArray(ary, mapFn, loVal) {
28 if (ary.length == 0)
29 return 1;
30
31 var low = 0;
32 var high = ary.length - 1;
33 var i, comparison;
34 var hitPos = -1;
35 while (low <= high) {
36 i = Math.floor((low + high) / 2);
37 comparison = mapFn(ary[i]) - loVal;
38 if (comparison < 0) {
39 low = i + 1; continue;
40 } else if (comparison > 0) {
41 high = i - 1; continue;
42 } else {
43 hitPos = i;
44 high = i - 1;
45 }
46 }
47 // return where we hit, or failing that the low pos
48 return hitPos != -1 ? hitPos : low;
49 }
50
51 /**
52 * Finds an index in an array of intervals that either
53 * intersects the provided loVal, or if no intersection is found,
54 * the index of the first interval whose start is > loVal.
55 *
56 * The array of intervals is defined implicitly via two mapping functions
57 * over the provided ary. mapLoFn determines the lower value of the interval,
58 * mapWidthFn the width. Intersection is lower-inclusive, e.g. [lo,lo+w).
59 *
60 * The array of intervals formed by this mapping must be non-overlapping and
61 * sorted in ascending order by loVal.
62 *
63 * @param {Array} ary An array of objects that can be converted into sorted
64 * nonoverlapping ranges [x,y) using the mapLoFn and mapWidth.
65 * @param {function():*} mapLoFn Callback that produces the low value for the
66 * interval represented by an element in the array.
67 * @param {function():*} mapLoFn Callback that produces the width for the
68 * interval represented by an element in the array.
69 * @param {number} loVal The low value for the search.
70 * @return {Number} An index in the array that intersects or is first-above
71 * loVal, -1 if none found and loVal is below than all the intervals,
72 * ary.length if loVal is greater than all the intervals.
73 */
74 function findLowIndexInSortedIntervals(ary, mapLoFn, mapWidthFn, loVal) {
75 var first = findLowIndexInSortedArray(ary, mapLoFn, loVal);
76 if (first == 0) {
77 if (loVal >= mapLoFn(ary[0]) &&
78 loVal < mapLoFn(ary[0] + mapWidthFn(ary[0]))) {
79 return 0;
80 } else {
81 return -1;
82 }
83 } else if (first <= ary.length &&
84 loVal >= mapLoFn(ary[first - 1]) &&
85 loVal < mapLoFn(ary[first - 1]) + mapWidthFn(ary[first - 1])) {
86 return first - 1;
87 } else {
88 return ary.length;
89 }
90 }
91
92 /**
93 * Calls cb for all intervals in the implicit array of intervals
94 * defnied by ary, mapLoFn and mapHiFn that intersect the range
95 * [loVal,hiVal)
96 *
97 * This function uses the same scheme as findLowIndexInSortedArray
98 * to define the intervals. The same restrictions on sortedness and
99 * non-overlappingness apply.
100 *
101 * @param {Array} ary An array of objects that can be converted into sorted
102 * nonoverlapping ranges [x,y) using the mapLoFn and mapWidth.
103 * @param {function():*} mapLoFn Callback that produces the low value for the
104 * interval represented by an element in the array.
105 * @param {function():*} mapLoFn Callback that produces the width for the
106 * interval represented by an element in the array.
107 * @param {number} The low value for the search, inclusive.
108 * @param {number} loVal The high value for the search, non inclusive.
109 * @param {function():*} cb The function to run for intersecting intervals.
110 */
111 function iterateOverIntersectingIntervals(ary, mapLoFn, mapWidthFn, loVal,
112 hiVal, cb) {
113 if (loVal > hiVal) return;
114
115 var i = findLowIndexInSortedArray(ary, mapLoFn, loVal);
116 if (i == -1) {
117 return;
118 }
119 if (i > 0) {
120 var hi = mapLoFn(ary[i - 1]) + mapWidthFn(ary[i - 1]);
121 if (hi >= loVal) {
122 cb(ary[i - 1]);
123 }
124 }
125 if (i == ary.length) {
126 return;
127 }
128
129 for (var n = ary.length; i < n; i++) {
130 var lo = mapLoFn(ary[i]);
131 if (lo >= hiVal)
132 break;
133 cb(ary[i]);
134 }
135 }
136
137 /**
138 * Non iterative version of iterateOverIntersectingIntervals.
139 *
140 * @return {Array} Array of elements in ary that intersect loVal, hiVal.
141 */
142 function getIntersectingIntervals(ary, mapLoFn, mapWidthFn, loVal, hiVal) {
143 var tmp = [];
144 iterateOverIntersectingIntervals(ary, mapLoFn, mapWidthFn, loVal, hiVal,
145 function(d) {
146 tmp.push(d);
147 });
148 return tmp;
149 }
150
151 return {
152 findLowIndexInSortedArray: findLowIndexInSortedArray,
153 findLowIndexInSortedIntervals: findLowIndexInSortedIntervals,
154 iterateOverIntersectingIntervals: iterateOverIntersectingIntervals,
155 getIntersectingIntervals: getIntersectingIntervals
156 };
157 });
OLDNEW
« no previous file with comments | « chrome/browser/resources/gpu_internals/profiling_view.js ('k') | chrome/browser/resources/gpu_internals/tests/big_trace.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698