MeteringRectangle.java revision 97f1c854993a65b2c700426a1e3a83b23ea65337
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 */ 1697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh 1772f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinpackage android.hardware.camera2.params; 18b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 19b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinimport android.util.Size; 20b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinimport static com.android.internal.util.Preconditions.*; 21b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 22b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinimport android.graphics.Point; 23b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinimport android.graphics.Rect; 2472f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinimport android.hardware.camera2.CameraCharacteristics; 2572f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinimport android.hardware.camera2.CaptureRequest; 263c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.utils.HashCodeHelpers; 27b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 28b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin/** 2997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * An immutable class to represent a rectangle {@code (x, y, width, height)} with an additional 3097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * weight component. 3197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * <p> 3297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * The rectangle is defined to be inclusive of the specified coordinates. 3397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * </p> 3497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * <p> 3597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * When used with a {@link CaptureRequest}, the coordinate system is based on the active pixel 36b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * array, with {@code (0,0)} being the top-left pixel in the 37b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE active pixel array}, and 38b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * {@code (android.sensor.info.activeArraySize.width - 1, 3997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * android.sensor.info.activeArraySize.height - 1)} being the bottom-right pixel in the active pixel 4097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * array. 4197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * </p> 4297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * <p> 4397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * The weight must range from {@value #METERING_WEIGHT_MIN} to {@value #METERING_WEIGHT_MAX} 4497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * inclusively, and represents a weight for every pixel in the area. This means that a large 4597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * metering area with the same weight as a smaller area will have more effect in the metering 4697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * result. Metering areas can partially overlap and the camera device will add the weights in the 4797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * overlap rectangle. 4897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * </p> 4997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * <p> 5097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * If all rectangles have 0 weight, then no specific metering area needs to be used by the camera 5197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * device. If the metering rectangle is outside the used android.scaler.cropRegion returned in 5297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * capture result metadata, the camera device will ignore the sections outside the rectangle and 5397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * output the used sections in the result metadata. 54b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * </p> 55b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 56b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinpublic final class MeteringRectangle { 5797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh /** 5897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * The minimum value of valid metering weight. 5997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh */ 6097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh public static final int METERING_WEIGHT_MIN = 0; 6197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh 6297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh /** 6397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * The maximum value of valid metering weight. 6497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh */ 6597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh public static final int METERING_WEIGHT_MAX = 1000; 6697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh 6797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh /** 6897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * Weights set to this value will cause the camera device to ignore this rectangle. 6997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * If all metering rectangles are weighed with 0, the camera device will choose its own metering 7097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * rectangles. 7197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh */ 7297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh public static final int METERING_WEIGHT_DONT_CARE = 0; 73b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 74b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin private final int mX; 75b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin private final int mY; 76b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin private final int mWidth; 77b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin private final int mHeight; 78b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin private final int mWeight; 79b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 80b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 81b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Create a new metering rectangle. 82b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 83b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param x coordinate >= 0 84b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param y coordinate >= 0 85b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param width width >= 0 86b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param height height >= 0 8797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * @param meteringWeight weight between {@value #METERING_WEIGHT_MIN} and 8897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh * {@value #METERING_WEIGHT_MAX} inclusively 89817f8933ee1c11130ad2ca45b5ac8ce8b729f125Yin-Chia Yeh * @throws IllegalArgumentException if any of the parameters were negative 90b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 91b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public MeteringRectangle(int x, int y, int width, int height, int meteringWeight) { 92b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mX = checkArgumentNonnegative(x, "x must be nonnegative"); 93b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mY = checkArgumentNonnegative(y, "y must be nonnegative"); 94b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mWidth = checkArgumentNonnegative(width, "width must be nonnegative"); 95b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mHeight = checkArgumentNonnegative(height, "height must be nonnegative"); 9697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh mWeight = checkArgumentInRange( 9797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh meteringWeight, METERING_WEIGHT_MIN, METERING_WEIGHT_MAX, "meteringWeight"); 98b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 99b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 100b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 101b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Create a new metering rectangle. 102b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 103b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param xy a non-{@code null} {@link Point} with both x,y >= 0 104b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param dimensions a non-{@code null} {@link android.util.Size Size} with width, height >= 0 105b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param meteringWeight weight >= 0 106b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 107817f8933ee1c11130ad2ca45b5ac8ce8b729f125Yin-Chia Yeh * @throws IllegalArgumentException if any of the parameters were negative 108b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws NullPointerException if any of the arguments were null 109b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 110b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public MeteringRectangle(Point xy, Size dimensions, int meteringWeight) { 111b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin checkNotNull(xy, "xy must not be null"); 112b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin checkNotNull(dimensions, "dimensions must not be null"); 113b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 114b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mX = checkArgumentNonnegative(xy.x, "x must be nonnegative"); 115b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mY = checkArgumentNonnegative(xy.y, "y must be nonnegative"); 116b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mWidth = checkArgumentNonnegative(dimensions.getWidth(), "width must be nonnegative"); 117b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mHeight = checkArgumentNonnegative(dimensions.getHeight(), "height must be nonnegative"); 118b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mWeight = checkArgumentNonnegative(meteringWeight, "meteringWeight must be nonnegative"); 119b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 120b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 121b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 122b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Create a new metering rectangle. 123b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 124b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param rect a non-{@code null} rectangle with all x,y,w,h dimensions >= 0 125b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param meteringWeight weight >= 0 126b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 127817f8933ee1c11130ad2ca45b5ac8ce8b729f125Yin-Chia Yeh * @throws IllegalArgumentException if any of the parameters were negative 128b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @throws NullPointerException if any of the arguments were null 129b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 130b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public MeteringRectangle(Rect rect, int meteringWeight) { 131b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin checkNotNull(rect, "rect must not be null"); 132b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 133b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mX = checkArgumentNonnegative(rect.left, "rect.left must be nonnegative"); 134b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mY = checkArgumentNonnegative(rect.top, "rect.top must be nonnegative"); 135b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mWidth = checkArgumentNonnegative(rect.width(), "rect.width must be nonnegative"); 136b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mHeight = checkArgumentNonnegative(rect.height(), "rect.height must be nonnegative"); 137b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin mWeight = checkArgumentNonnegative(meteringWeight, "meteringWeight must be nonnegative"); 138b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 139b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 140b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 141b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Return the X coordinate of the left side of the rectangle. 142b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 143b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return x coordinate >= 0 144b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 145b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int getX() { 146b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return mX; 147b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 148b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 149b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 150b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Return the Y coordinate of the upper side of the rectangle. 151b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 152b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return y coordinate >= 0 153b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 154b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int getY() { 155b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return mY; 156b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 157b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 158b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 159b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Return the width of the rectangle. 160b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 161b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return width >= 0 162b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 163b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int getWidth() { 164b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return mWidth; 165b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 166b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 167b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 168b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Return the height of the rectangle. 169b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 170b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return height >= 0 171b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 172b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int getHeight() { 173b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return mHeight; 174b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 175b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 176b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 177b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Return the metering weight of the rectangle. 178b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 179b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return weight >= 0 180b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 181b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int getMeteringWeight() { 182b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return mWeight; 183b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 184b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 185b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 186b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Convenience method to create the upper-left (X,Y) coordinate as a {@link Point}. 187b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 188b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return {@code (x,y)} point with both x,y >= 0 189b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 190b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public Point getUpperLeftPoint() { 191b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return new Point(mX, mY); 192b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 193b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 194b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 195b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Convenience method to create the size from this metering rectangle. 196b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 197b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>This strips away the X,Y,weight from the rectangle.</p> 198b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 199b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return a Size with non-negative width and height 200b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 201b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public Size getSize() { 202b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return new Size(mWidth, mHeight); 203b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 204b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 205b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 206b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Convenience method to create a {@link Rect} from this metering rectangle. 207b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 208b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>This strips away the weight from the rectangle.</p> 209b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 210b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return a {@link Rect} with non-negative x1, y1, x2, y2 211b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 212b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public Rect getRect() { 213b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return new Rect(mX, mY, mX + mWidth, mY + mHeight); 214b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 215b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 216b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 217b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * {@inheritDoc} 218b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 219b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin @Override 220b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public boolean equals(final Object other) { 2213c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return other instanceof MeteringRectangle && equals((MeteringRectangle)other); 222b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 223b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 224b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 225b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Compare two metering rectangles to see if they are equal. 226b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 227b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Two weighted rectangles are only considered equal if each of their components 228b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * (x, y, width, height, weight) is respectively equal. 229b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 230b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @param other Another MeteringRectangle 231b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * 232b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * @return {@code true} if the metering rectangles are equal, {@code false} otherwise 233b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 234b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public boolean equals(final MeteringRectangle other) { 235b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin if (other == null) { 236b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return false; 237b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 238b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 239b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return (mX == other.mX 240b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin && mY == other.mY 241b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin && mWidth == other.mWidth 242b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin && mHeight == other.mHeight 243817f8933ee1c11130ad2ca45b5ac8ce8b729f125Yin-Chia Yeh && mWeight == other.mWeight); 244b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 245b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin 246b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin /** 247b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * {@inheritDoc} 248b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */ 249b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin @Override 250b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin public int hashCode() { 251b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin return HashCodeHelpers.hashCode(mX, mY, mWidth, mHeight, mWeight); 252b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin } 253b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin} 254