blob: 79fa160a4fe06c35539b75e95bc90ac19d374d9f [file] [log] [blame]
/*
* Copyright (C) 2006 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.
*/
package com.android.traceview;
class TickScaler {
private double mMinVal; // required input
private double mMaxVal; // required input
private double mRangeVal;
private int mNumPixels; // required input
private int mPixelsPerTick; // required input
private double mPixelsPerRange;
private double mTickIncrement;
private double mMinMajorTick;
TickScaler(double minVal, double maxVal, int numPixels, int pixelsPerTick) {
mMinVal = minVal;
mMaxVal = maxVal;
mNumPixels = numPixels;
mPixelsPerTick = pixelsPerTick;
}
public void setMinVal(double minVal) {
mMinVal = minVal;
}
public double getMinVal() {
return mMinVal;
}
public void setMaxVal(double maxVal) {
mMaxVal = maxVal;
}
public double getMaxVal() {
return mMaxVal;
}
public void setNumPixels(int numPixels) {
mNumPixels = numPixels;
}
public int getNumPixels() {
return mNumPixels;
}
public void setPixelsPerTick(int pixelsPerTick) {
mPixelsPerTick = pixelsPerTick;
}
public int getPixelsPerTick() {
return mPixelsPerTick;
}
public void setPixelsPerRange(double pixelsPerRange) {
mPixelsPerRange = pixelsPerRange;
}
public double getPixelsPerRange() {
return mPixelsPerRange;
}
public void setTickIncrement(double tickIncrement) {
mTickIncrement = tickIncrement;
}
public double getTickIncrement() {
return mTickIncrement;
}
public void setMinMajorTick(double minMajorTick) {
mMinMajorTick = minMajorTick;
}
public double getMinMajorTick() {
return mMinMajorTick;
}
// Convert a time value to a 0-based pixel value
public int valueToPixel(double value) {
return (int) Math.ceil(mPixelsPerRange * (value - mMinVal) - 0.5);
}
// Convert a time value to a 0-based fractional pixel
public double valueToPixelFraction(double value) {
return mPixelsPerRange * (value - mMinVal);
}
// Convert a 0-based pixel value to a time value
public double pixelToValue(int pixel) {
return mMinVal + (pixel / mPixelsPerRange);
}
public void computeTicks(boolean useGivenEndPoints) {
int numTicks = mNumPixels / mPixelsPerTick;
mRangeVal = mMaxVal - mMinVal;
mTickIncrement = mRangeVal / numTicks;
double dlogTickIncrement = Math.log10(mTickIncrement);
int logTickIncrement = (int) Math.floor(dlogTickIncrement);
double scale = Math.pow(10, logTickIncrement);
double scaledTickIncr = mTickIncrement / scale;
if (scaledTickIncr > 5.0)
scaledTickIncr = 10;
else if (scaledTickIncr > 2)
scaledTickIncr = 5;
else if (scaledTickIncr > 1)
scaledTickIncr = 2;
else
scaledTickIncr = 1;
mTickIncrement = scaledTickIncr * scale;
if (!useGivenEndPoints) {
// Round up the max val to the next minor tick
double minorTickIncrement = mTickIncrement / 5;
double dval = mMaxVal / minorTickIncrement;
int ival = (int) dval;
if (ival != dval)
mMaxVal = (ival + 1) * minorTickIncrement;
// Round down the min val to a multiple of tickIncrement
ival = (int) (mMinVal / mTickIncrement);
mMinVal = ival * mTickIncrement;
mMinMajorTick = mMinVal;
} else {
int ival = (int) (mMinVal / mTickIncrement);
mMinMajorTick = ival * mTickIncrement;
if (mMinMajorTick < mMinVal)
mMinMajorTick = mMinMajorTick + mTickIncrement;
}
mRangeVal = mMaxVal - mMinVal;
mPixelsPerRange = (double) mNumPixels / mRangeVal;
}
}