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