blob: 3b31769ae2d3c527a30c55e4dc50a6bca8fa7536 [file] [log] [blame]
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {duration, time} from './time';
import {HighPrecisionTime} from './high_precision_time';
import {HighPrecisionTimeSpan} from './high_precision_time_span';
import {HorizontalBounds} from './geom';
export class TimeScale {
readonly timeSpan: HighPrecisionTimeSpan;
readonly pxBounds: HorizontalBounds;
private readonly timePerPx: number;
constructor(timespan: HighPrecisionTimeSpan, pxBounds: HorizontalBounds) {
this.pxBounds = pxBounds;
this.timeSpan = timespan;
const delta = pxBounds.right - pxBounds.left;
if (timespan.duration <= 0 || delta <= 0) {
this.timePerPx = 1;
} else {
this.timePerPx = timespan.duration / delta;
}
}
timeToPx(ts: time): number {
const timeOffset =
Number(ts - this.timeSpan.start.integral) -
this.timeSpan.start.fractional;
return this.pxBounds.left + timeOffset / this.timePerPx;
}
hpTimeToPx(time: HighPrecisionTime): number {
const timeOffset = time.sub(this.timeSpan.start).toNumber();
return this.pxBounds.left + timeOffset / this.timePerPx;
}
// Convert pixels to a high precision time object, which can be further
// converted to other time formats.
pxToHpTime(px: number): HighPrecisionTime {
const timeOffset = (px - this.pxBounds.left) * this.timePerPx;
return this.timeSpan.start.addNumber(timeOffset);
}
durationToPx(dur: duration): number {
return Number(dur) / this.timePerPx;
}
pxToDuration(pxDelta: number): number {
return pxDelta * this.timePerPx;
}
}