SizeF.java revision b3a78b2ca9655396e2d73950221d187b7e5bb3ba
1b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin/*
2b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
3b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
4b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * you may not use this file except in compliance with the License.
6b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * You may obtain a copy of the License at
7b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
8b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
10b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * See the License for the specific language governing permissions and
14b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * limitations under the License.
15b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */
16b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
17b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinpackage android.util;
18b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
19b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinimport static com.android.internal.util.Preconditions.*;
20b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
21b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin/**
22b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Immutable class for describing width and height dimensions in some arbitrary
23b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * unit.
24b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>
25b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Width and height are finite values stored as a floating point representation.
26b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * </p>
27b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */
28b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinpublic final class SizeF {
29b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
30b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Create a new immutable SizeF instance.
31b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
32b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>Both the {@code width} and the {@code height} must be a finite number.
33b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * In particular, {@code NaN} and positive/negative infinity are illegal values.</p>
34b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
35b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param width The width of the size
36b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param height The height of the size
37b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
38b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException
39b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *             if either {@code width} or {@code height} was not finite.
40b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
41b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public SizeF(final float width, final float height) {
42b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        mWidth = checkArgumentFinite(width, "width");
43b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        mHeight = checkArgumentFinite(height, "height");
44b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
45b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
46b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
47b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Get the width of the size (as an arbitrary unit).
48b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return width
49b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
50b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public float getWidth() {
51b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mWidth;
52b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
53b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
54b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
55b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Get the height of the size (as an arbitrary unit).
56b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return height
57b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
58b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public float getHeight() {
59b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mHeight;
60b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
61b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
62b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
63b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Check if this size is equal to another size.
64b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
65b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>Two sizes are equal if and only if both their widths and heights are the same.</p>
66b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
67b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>For this purpose, the width/height float values are considered to be the same if and only
68b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * if the method {@link Float#floatToIntBits(float)} returns the identical {@code int} value
69b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * when applied to each.</p>
70b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
71b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return {@code true} if the objects were equal, {@code false} otherwise
72b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
73b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
74b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public boolean equals(final Object obj) {
75b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (obj == null) {
76b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return false;
77b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
78b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (this == obj) {
79b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return true;
80b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
81b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (obj instanceof SizeF) {
82b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            final SizeF other = (SizeF) obj;
83b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return mWidth == other.mWidth && mHeight == other.mHeight;
84b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
85b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return false;
86b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
87b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
88b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
89b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Return the size represented as a string with the format {@code "WxH"}
90b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
91b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return string representation of the size
92b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
93b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
94b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public String toString() {
95b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mWidth + "x" + mHeight;
96b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
97b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
98b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
99b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * {@inheritDoc}
100b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
101b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
102b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public int hashCode() {
103b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return Float.floatToIntBits(mWidth) ^ Float.floatToIntBits(mHeight);
104b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
105b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
106b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    private final float mWidth;
107b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    private final float mHeight;
108b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin};
109