1d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke/*
2d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * Copyright (C) 2014 The Android Open Source Project
3d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke *
4d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * Licensed under the Apache License, Version 2.0 (the "License");
5d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * you may not use this file except in compliance with the License.
6d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * You may obtain a copy of the License at
7d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke *
8d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke *      http://www.apache.org/licenses/LICENSE-2.0
9d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke *
10d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * Unless required by applicable law or agreed to in writing, software
11d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * distributed under the License is distributed on an "AS IS" BASIS,
12d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * See the License for the specific language governing permissions and
14d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * limitations under the License.
15d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke */
16d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
17d6396d67201fb2b64d13070324bb115c9c23b08aJason Gereckepackage android.hardware.input;
18d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
19d6396d67201fb2b64d13070324bb115c9c23b08aJason Gereckeimport android.os.Parcel;
20d6396d67201fb2b64d13070324bb115c9c23b08aJason Gereckeimport android.os.Parcelable;
21d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
22d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke/**
23d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * Encapsulates calibration data for input devices.
24d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke *
25d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke * @hide
26d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke */
27d6396d67201fb2b64d13070324bb115c9c23b08aJason Gereckepublic class TouchCalibration implements Parcelable {
28d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
29d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public static final TouchCalibration IDENTITY = new TouchCalibration();
30d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
31d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public static final Parcelable.Creator<TouchCalibration> CREATOR
32d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            = new Parcelable.Creator<TouchCalibration>() {
33d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        public TouchCalibration createFromParcel(Parcel in) {
34d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            return new TouchCalibration(in);
35d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        }
36d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
37d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        public TouchCalibration[] newArray(int size) {
38d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            return new TouchCalibration[size];
39d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        }
40d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    };
41d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
42d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    private final float mXScale, mXYMix, mXOffset;
43d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    private final float mYXMix, mYScale, mYOffset;
44d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
45d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    /**
46d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * Create a new TouchCalibration initialized to the identity transformation.
47d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     */
48d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public TouchCalibration() {
49d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        this(1,0,0,0,1,0);
50d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
51d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
52d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    /**
53d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * Create a new TouchCalibration from affine transformation paramters.
54d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param xScale   Influence of input x-axis value on output x-axis value.
55d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param xyMix    Influence of input y-axis value on output x-axis value.
56d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param xOffset  Constant offset to be applied to output x-axis value.
57d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param yXMix    Influence of input x-axis value on output y-axis value.
58d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param yScale   Influence of input y-axis value on output y-axis value.
59d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     * @param yOffset  Constant offset to be applied to output y-axis value.
60d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke     */
61d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public TouchCalibration(float xScale, float xyMix, float xOffset,
62d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            float yxMix, float yScale, float yOffset) {
63d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXScale  = xScale;
64d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXYMix   = xyMix;
65d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXOffset = xOffset;
66d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYXMix   = yxMix;
67d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYScale  = yScale;
68d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYOffset = yOffset;
69d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
70d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
71d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public TouchCalibration(Parcel in) {
72d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXScale  = in.readFloat();
73d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXYMix   = in.readFloat();
74d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mXOffset = in.readFloat();
75d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYXMix   = in.readFloat();
76d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYScale  = in.readFloat();
77d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        mYOffset = in.readFloat();
78d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
79d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
80d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    @Override
81d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public void writeToParcel(Parcel dest, int flags) {
82d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mXScale);
83d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mXYMix);
84d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mXOffset);
85d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mYXMix);
86d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mYScale);
87d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        dest.writeFloat(mYOffset);
88d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
89d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
90d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    @Override
91d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public int describeContents() {
92d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        return 0;
93d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
94d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
95d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public float[] getAffineTransform() {
96d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        return new float[] { mXScale, mXYMix, mXOffset, mYXMix, mYScale, mYOffset };
97d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
98d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
99d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    @Override
100d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public boolean equals(Object obj) {
101d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        if (obj == this) {
102d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            return true;
103d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        } else if (obj instanceof TouchCalibration) {
104d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            TouchCalibration cal = (TouchCalibration)obj;
105d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
106d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            return (cal.mXScale  == mXScale)  &&
107d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke                   (cal.mXYMix   == mXYMix)   &&
108d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke                   (cal.mXOffset == mXOffset) &&
109d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke                   (cal.mYXMix   == mYXMix)   &&
110d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke                   (cal.mYScale  == mYScale)  &&
111d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke                   (cal.mYOffset == mYOffset);
112d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        } else {
113d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke            return false;
114d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        }
115d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
116d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke
117d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    @Override
118d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    public int hashCode() {
119d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke        return Float.floatToIntBits(mXScale)  ^
120d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke               Float.floatToIntBits(mXYMix)   ^
121d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke               Float.floatToIntBits(mXOffset) ^
122d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke               Float.floatToIntBits(mYXMix)   ^
123d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke               Float.floatToIntBits(mYScale)  ^
124d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke               Float.floatToIntBits(mYOffset);
125d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke    }
126d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright
127d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright    @Override
128d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright    public String toString() {
129d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright        return String.format("[%f, %f, %f, %f, %f, %f]",
130d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright                mXScale, mXYMix, mXOffset, mYXMix, mYScale, mYOffset);
131d5f7ed9fe9dc3590f6ef9cb7470e29e836a95907Michael Wright    }
132d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke}
133