12523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan/*
22523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Copyright (C) 2012 The Android Open Source Project
32523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan *
42523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License");
52523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * you may not use this file except in compliance with the License.
62523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * You may obtain a copy of the License at
72523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan *
82523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan *      http://www.apache.org/licenses/LICENSE-2.0
92523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan *
102523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * Unless required by applicable law or agreed to in writing, software
112523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS,
122523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * See the License for the specific language governing permissions and
142523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan * limitations under the License.
152523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan */
162523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
17a16e7b50f3148f581439509279f242092e254309ztenghuipackage com.android.camera.exif;
182523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
192272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu// TODO: Move this class to under util package.
20acc9b347ded215b08ea09263812525efafd91b13Earl Ou/**
21c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * The rational data type of EXIF tag. Contains a pair of longs representing the
22c274ded801f745d6318186958107622e7a4fef33Ruben Brunk * numerator and denominator of a Rational number.
23acc9b347ded215b08ea09263812525efafd91b13Earl Ou */
242523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyanpublic class Rational {
252523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
26c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    private final long mNumerator;
272523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    private final long mDenominator;
282523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
29c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    /**
30c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * Create a Rational with a given numerator and denominator.
31c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     *
322272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     * @param numerator
33c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * @param denominator
34c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     */
352272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    public Rational(long numerator, long denominator) {
362272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mNumerator = numerator;
372523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan        mDenominator = denominator;
382523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    }
392523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
40c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    /**
41c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * Create a copy of a Rational.
42c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     */
43c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    public Rational(Rational r) {
44c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        mNumerator = r.mNumerator;
45c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        mDenominator = r.mDenominator;
46c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    }
47c274ded801f745d6318186958107622e7a4fef33Ruben Brunk
48c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    /**
49c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * Gets the numerator of the rational.
50acc9b347ded215b08ea09263812525efafd91b13Earl Ou     */
51c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    public long getNumerator() {
52c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        return mNumerator;
532523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    }
542523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
55c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    /**
56acc9b347ded215b08ea09263812525efafd91b13Earl Ou     * Gets the denominator of the rational
57acc9b347ded215b08ea09263812525efafd91b13Earl Ou     */
582523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    public long getDenominator() {
592523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan        return mDenominator;
602523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    }
612523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan
62c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    /**
63c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * Gets the rational value as type double. Will cause a divide-by-zero error
64c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     * if the denominator is 0.
65c274ded801f745d6318186958107622e7a4fef33Ruben Brunk     */
66c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    public double toDouble() {
67c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        return mNumerator / (double) mDenominator;
68c274ded801f745d6318186958107622e7a4fef33Ruben Brunk    }
69c274ded801f745d6318186958107622e7a4fef33Ruben Brunk
702523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    @Override
712523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    public boolean equals(Object obj) {
72c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        if (obj == null) {
73c274ded801f745d6318186958107622e7a4fef33Ruben Brunk            return false;
74c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        }
75c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        if (this == obj) {
76c274ded801f745d6318186958107622e7a4fef33Ruben Brunk            return true;
77c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        }
782523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan        if (obj instanceof Rational) {
792523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan            Rational data = (Rational) obj;
80c274ded801f745d6318186958107622e7a4fef33Ruben Brunk            return mNumerator == data.mNumerator && mDenominator == data.mDenominator;
812523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan        }
822523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan        return false;
832523f4344661b1e6a734d1ba20e92308c87a7c54Hung-ying Tyan    }
84c56ddd3de2c9571e0561b1c7295b502927d7b1d4Earl Ou
85c56ddd3de2c9571e0561b1c7295b502927d7b1d4Earl Ou    @Override
86c56ddd3de2c9571e0561b1c7295b502927d7b1d4Earl Ou    public String toString() {
87c274ded801f745d6318186958107622e7a4fef33Ruben Brunk        return mNumerator + "/" + mDenominator;
88c56ddd3de2c9571e0561b1c7295b502927d7b1d4Earl Ou    }
89c274ded801f745d6318186958107622e7a4fef33Ruben Brunk}
90