173e933f1f57002d2e593aa7b471811d8837f8767Earl Ou/*
273e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * Copyright (C) 2012 The Android Open Source Project
373e933f1f57002d2e593aa7b471811d8837f8767Earl Ou *
473e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * Licensed under the Apache License, Version 2.0 (the "License");
573e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * you may not use this file except in compliance with the License.
673e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * You may obtain a copy of the License at
773e933f1f57002d2e593aa7b471811d8837f8767Earl Ou *
873e933f1f57002d2e593aa7b471811d8837f8767Earl Ou *      http://www.apache.org/licenses/LICENSE-2.0
973e933f1f57002d2e593aa7b471811d8837f8767Earl Ou *
1073e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * Unless required by applicable law or agreed to in writing, software
1173e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * distributed under the License is distributed on an "AS IS" BASIS,
1273e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * See the License for the specific language governing permissions and
1473e933f1f57002d2e593aa7b471811d8837f8767Earl Ou * limitations under the License.
1573e933f1f57002d2e593aa7b471811d8837f8767Earl Ou */
1673e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
1773e933f1f57002d2e593aa7b471811d8837f8767Earl Oupackage com.android.gallery3d.exif;
1873e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
191792070857f96943ae110869d66f092001ad526eEarl Ou/**
206e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * The rational data type of EXIF tag. Contains a pair of longs representing the
216e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk * numerator and denominator of a Rational number.
221792070857f96943ae110869d66f092001ad526eEarl Ou */
2373e933f1f57002d2e593aa7b471811d8837f8767Earl Oupublic class Rational {
2473e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
256e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    private final long mNumerator;
2673e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    private final long mDenominator;
2773e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
286e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    /**
296e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * Create a Rational with a given numerator and denominator.
306e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     *
316e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * @param nominator
326e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * @param denominator
336e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     */
3473e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    public Rational(long nominator, long denominator) {
356e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        mNumerator = nominator;
3673e933f1f57002d2e593aa7b471811d8837f8767Earl Ou        mDenominator = denominator;
3773e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    }
3873e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
396e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    /**
406e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * Create a copy of a Rational.
416e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     */
426e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    public Rational(Rational r) {
436e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        mNumerator = r.mNumerator;
446e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        mDenominator = r.mDenominator;
456e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    }
466e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk
476e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    /**
486e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * Gets the numerator of the rational.
491792070857f96943ae110869d66f092001ad526eEarl Ou     */
506e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    public long getNumerator() {
516e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        return mNumerator;
5273e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    }
5373e933f1f57002d2e593aa7b471811d8837f8767Earl Ou
546e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    /**
551792070857f96943ae110869d66f092001ad526eEarl Ou     * Gets the denominator of the rational
561792070857f96943ae110869d66f092001ad526eEarl Ou     */
5773e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    public long getDenominator() {
5873e933f1f57002d2e593aa7b471811d8837f8767Earl Ou        return mDenominator;
5973e933f1f57002d2e593aa7b471811d8837f8767Earl Ou    }
60cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou
616e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    /**
626e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * Gets the rational value as type double. Will cause a divide-by-zero error
636e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     * if the denominator is 0.
646e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk     */
656e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    public double toDouble() {
666e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        return mNumerator / (double) mDenominator;
676e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk    }
686e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk
69cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou    @Override
70cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou    public boolean equals(Object obj) {
716e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        if (obj == null) {
726e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk            return false;
736e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        }
746e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        if (this == obj) {
756e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk            return true;
766e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        }
77cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou        if (obj instanceof Rational) {
78cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou            Rational data = (Rational) obj;
796e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk            return mNumerator == data.mNumerator && mDenominator == data.mDenominator;
80cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou        }
81cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou        return false;
82cde6ac521216801e835df1c20b68dd21d4fd04a4Earl Ou    }
83ca56f8e30a4d91c7b7e6f75a39a1a69801e49cbbEarl Ou
84ca56f8e30a4d91c7b7e6f75a39a1a69801e49cbbEarl Ou    @Override
85ca56f8e30a4d91c7b7e6f75a39a1a69801e49cbbEarl Ou    public String toString() {
866e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk        return mNumerator + "/" + mDenominator;
87ca56f8e30a4d91c7b7e6f75a39a1a69801e49cbbEarl Ou    }
886e6a524390d8ddebce5de0dcc8ae258e652ec80aRuben Brunk}
89