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