1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2018 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {duration, time} from './time'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {HighPrecisionTime} from './high_precision_time'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {HighPrecisionTimeSpan} from './high_precision_time_span'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {HorizontalBounds} from './geom'; 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerexport class TimeScale { 21*6dbdd20aSAndroid Build Coastguard Worker readonly timeSpan: HighPrecisionTimeSpan; 22*6dbdd20aSAndroid Build Coastguard Worker readonly pxBounds: HorizontalBounds; 23*6dbdd20aSAndroid Build Coastguard Worker private readonly timePerPx: number; 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker constructor(timespan: HighPrecisionTimeSpan, pxBounds: HorizontalBounds) { 26*6dbdd20aSAndroid Build Coastguard Worker this.pxBounds = pxBounds; 27*6dbdd20aSAndroid Build Coastguard Worker this.timeSpan = timespan; 28*6dbdd20aSAndroid Build Coastguard Worker const delta = pxBounds.right - pxBounds.left; 29*6dbdd20aSAndroid Build Coastguard Worker if (timespan.duration <= 0 || delta <= 0) { 30*6dbdd20aSAndroid Build Coastguard Worker this.timePerPx = 1; 31*6dbdd20aSAndroid Build Coastguard Worker } else { 32*6dbdd20aSAndroid Build Coastguard Worker this.timePerPx = timespan.duration / delta; 33*6dbdd20aSAndroid Build Coastguard Worker } 34*6dbdd20aSAndroid Build Coastguard Worker } 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker timeToPx(ts: time): number { 37*6dbdd20aSAndroid Build Coastguard Worker const timeOffset = 38*6dbdd20aSAndroid Build Coastguard Worker Number(ts - this.timeSpan.start.integral) - 39*6dbdd20aSAndroid Build Coastguard Worker this.timeSpan.start.fractional; 40*6dbdd20aSAndroid Build Coastguard Worker return this.pxBounds.left + timeOffset / this.timePerPx; 41*6dbdd20aSAndroid Build Coastguard Worker } 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker hpTimeToPx(time: HighPrecisionTime): number { 44*6dbdd20aSAndroid Build Coastguard Worker const timeOffset = time.sub(this.timeSpan.start).toNumber(); 45*6dbdd20aSAndroid Build Coastguard Worker return this.pxBounds.left + timeOffset / this.timePerPx; 46*6dbdd20aSAndroid Build Coastguard Worker } 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker // Convert pixels to a high precision time object, which can be further 49*6dbdd20aSAndroid Build Coastguard Worker // converted to other time formats. 50*6dbdd20aSAndroid Build Coastguard Worker pxToHpTime(px: number): HighPrecisionTime { 51*6dbdd20aSAndroid Build Coastguard Worker const timeOffset = (px - this.pxBounds.left) * this.timePerPx; 52*6dbdd20aSAndroid Build Coastguard Worker return this.timeSpan.start.addNumber(timeOffset); 53*6dbdd20aSAndroid Build Coastguard Worker } 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker durationToPx(dur: duration): number { 56*6dbdd20aSAndroid Build Coastguard Worker return Number(dur) / this.timePerPx; 57*6dbdd20aSAndroid Build Coastguard Worker } 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker pxToDuration(pxDelta: number): number { 60*6dbdd20aSAndroid Build Coastguard Worker return pxDelta * this.timePerPx; 61*6dbdd20aSAndroid Build Coastguard Worker } 62*6dbdd20aSAndroid Build Coastguard Worker} 63