• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { ColorUtils } from '../../component/trace/base/ColorUtils.js';
17import {
18  BaseStruct,
19  drawFlagLine,
20  drawLines,
21  drawLoading,
22  drawSelection,
23  hiPerf,
24  HiPerfStruct,
25  PerfRender,
26  RequestMessage,
27} from './ProcedureWorkerCommon.js';
28import { TraceRow } from '../../component/trace/base/TraceRow.js';
29
30export class HiperfThreadRender extends PerfRender {
31  renderMainThread(hiPerfThreadReq: any, row: TraceRow<HiPerfThreadStruct>) {
32    let list = row.dataList;
33    let filter = row.dataListCache;
34    let groupBy10MS = hiPerfThreadReq.scale > 30_000_000;
35    if (list && row.dataList2.length == 0) {
36      row.dataList2 = HiPerfThreadStruct.groupBy10MS(list, hiPerfThreadReq.intervalPerf);
37    }
38    hiPerf(
39      list,
40      row.dataList2,
41      filter,
42      TraceRow.range?.startNS ?? 0,
43      TraceRow.range?.endNS ?? 0,
44      row.frame,
45      groupBy10MS,
46      hiPerfThreadReq.useCache || (TraceRow.range?.refresh ?? false)
47    );
48    hiPerfThreadReq.context.beginPath();
49    hiPerfThreadReq.context.fillStyle = ColorUtils.FUNC_COLOR[0];
50    hiPerfThreadReq.context.strokeStyle = ColorUtils.FUNC_COLOR[0];
51    let path = new Path2D();
52    let offset = groupBy10MS ? 0 : 3;
53    let find = false;
54    for (let re of filter) {
55      HiPerfThreadStruct.draw(hiPerfThreadReq.context, path, re, groupBy10MS);
56      if (row.isHover) {
57        if (re.frame && row.hoverX >= re.frame.x - offset && row.hoverX <= re.frame.x + re.frame.width + offset) {
58          HiPerfThreadStruct.hoverStruct = re;
59          find = true;
60        }
61      }
62    }
63    if (!find && row.isHover) HiPerfThreadStruct.hoverStruct = undefined;
64    groupBy10MS ? hiPerfThreadReq.context.fill(path) : hiPerfThreadReq.context.stroke(path);
65    hiPerfThreadReq.context.closePath();
66  }
67
68  render(hiPerfThreadRequest: RequestMessage, list: Array<any>, filter: Array<any>, dataList2: Array<any>) {
69    let groupBy10MS = hiPerfThreadRequest.scale > 100_000_000;
70    if (hiPerfThreadRequest.lazyRefresh) {
71      hiPerf(
72        list,
73        dataList2,
74        filter,
75        hiPerfThreadRequest.startNS,
76        hiPerfThreadRequest.endNS,
77        hiPerfThreadRequest.frame,
78        groupBy10MS,
79        hiPerfThreadRequest.useCache || !hiPerfThreadRequest.range.refresh
80      );
81    } else {
82      if (!hiPerfThreadRequest.useCache) {
83        hiPerf(
84          list,
85          dataList2,
86          filter,
87          hiPerfThreadRequest.startNS,
88          hiPerfThreadRequest.endNS,
89          hiPerfThreadRequest.frame,
90          groupBy10MS,
91          false
92        );
93      }
94    }
95    if (hiPerfThreadRequest.canvas) {
96      hiPerfThreadRequest.context.clearRect(0, 0, hiPerfThreadRequest.frame.width, hiPerfThreadRequest.frame.height);
97      let arr = filter;
98      if (
99        arr.length > 0 &&
100        !hiPerfThreadRequest.range.refresh &&
101        !hiPerfThreadRequest.useCache &&
102        hiPerfThreadRequest.lazyRefresh
103      ) {
104        drawLoading(
105          hiPerfThreadRequest.context,
106          hiPerfThreadRequest.startNS,
107          hiPerfThreadRequest.endNS,
108          hiPerfThreadRequest.totalNS,
109          hiPerfThreadRequest.frame,
110          arr[0].startNS,
111          arr[arr.length - 1].startNS + arr[arr.length - 1].dur
112        );
113      }
114      drawLines(
115        hiPerfThreadRequest.context,
116        hiPerfThreadRequest.xs,
117        hiPerfThreadRequest.frame.height,
118        hiPerfThreadRequest.lineColor
119      );
120      hiPerfThreadRequest.context.stroke();
121      hiPerfThreadRequest.context.beginPath();
122      HiPerfThreadStruct.hoverStruct = undefined;
123      hiPerfThreadRequest.context.fillStyle = ColorUtils.FUNC_COLOR[0];
124      hiPerfThreadRequest.context.strokeStyle = ColorUtils.FUNC_COLOR[0];
125      if (hiPerfThreadRequest.isHover) {
126        let offset = groupBy10MS ? 0 : 3;
127        for (let re of filter) {
128          if (
129            re.frame &&
130            hiPerfThreadRequest.hoverX >= re.frame.x - offset &&
131            hiPerfThreadRequest.hoverX <= re.frame.x + re.frame.width + offset
132          ) {
133            HiPerfThreadStruct.hoverStruct = re;
134            break;
135          }
136        }
137      } else {
138        HiPerfThreadStruct.hoverStruct = hiPerfThreadRequest.params.hoverStruct;
139      }
140      HiPerfThreadStruct.selectStruct = hiPerfThreadRequest.params.selectStruct;
141      let path = new Path2D();
142      for (let re of filter) {
143        HiPerfThreadStruct.draw(hiPerfThreadRequest.context, path, re, groupBy10MS);
144      }
145      groupBy10MS ? hiPerfThreadRequest.context.fill(path) : hiPerfThreadRequest.context.stroke(path);
146      hiPerfThreadRequest.context.stroke();
147      hiPerfThreadRequest.context.closePath();
148      drawSelection(hiPerfThreadRequest.context, hiPerfThreadRequest.params);
149      drawFlagLine(
150        hiPerfThreadRequest.context,
151        hiPerfThreadRequest.flagMoveInfo,
152        hiPerfThreadRequest.flagSelectedInfo,
153        hiPerfThreadRequest.startNS,
154        hiPerfThreadRequest.endNS,
155        hiPerfThreadRequest.totalNS,
156        hiPerfThreadRequest.frame,
157        hiPerfThreadRequest.slicesTime
158      );
159    }
160    // @ts-ignore
161    self.postMessage({
162      id: hiPerfThreadRequest.id,
163      type: hiPerfThreadRequest.type,
164      results: hiPerfThreadRequest.canvas ? undefined : filter,
165      hover: HiPerfThreadStruct.hoverStruct,
166    });
167  }
168}
169
170export class HiPerfThreadStruct extends HiPerfStruct {
171  static hoverStruct: HiPerfThreadStruct | undefined;
172  static selectStruct: HiPerfThreadStruct | undefined;
173}
174