19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 195b3edbde20b446ecbfebe5d6ad0dcd735473ac75Chet Haaseimport android.annotation.CheckResult; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 24c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onoratoimport java.util.regex.Matcher; 25c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onoratoimport java.util.regex.Pattern; 261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rect holds four integer coordinates for a rectangle. The rectangle is 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * represented by the coordinates of its 4 edges (left, top, right bottom). 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These fields can be accessed directly. Use width() and height() to retrieve 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the rectangle's width and height. Note: most methods do not check to see that 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the coordinates are sorted correctly (i.e. left <= right and top <= bottom). 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Rect implements Parcelable { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int left; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int top; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int right; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int bottom; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 405d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers /** 415d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers * A helper class for flattened rectange pattern recognition. A separate 425d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers * class to avoid an initialization dependency on a regular expression 435d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers * causing Rect to not be initializable with an ahead-of-time compilation 445d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers * scheme. 455d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers */ 465d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers private static final class UnflattenHelper { 475d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers private static final Pattern FLATTENED_PATTERN = Pattern.compile( 48c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato "(-?\\d+) (-?\\d+) (-?\\d+) (-?\\d+)"); 49c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato 505d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers static Matcher getMatcher(String str) { 515d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers return FLATTENED_PATTERN.matcher(str); 525d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers } 535d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers } 545d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new empty Rect. All coordinates are initialized to 0. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect() {} 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new rectangle with the specified coordinates. Note: no range 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * checking is performed, so the caller must ensure that left <= right and 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top <= bottom. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 65852be16790d099f95fb2c4fe7b316455662ee97fPin Ting * @param left The X coordinate of the left side of the rectangle 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The Y coordinate of the top of the rectangle 67852be16790d099f95fb2c4fe7b316455662ee97fPin Ting * @param right The X coordinate of the right side of the rectangle 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The Y coordinate of the bottom of the rectangle 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect(int left, int top, int right, int bottom) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.left = left; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.top = top; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.right = right; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.bottom = bottom; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new rectangle, initialized with the values in the specified 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle (which is left unmodified). 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The rectangle whose coordinates are copied into the new 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect(Rect r) { 85dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy if (r == null) { 86dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy left = top = right = bottom = 0; 87dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy } else { 88dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy left = r.left; 89dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy top = r.top; 90dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy right = r.right; 91dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy bottom = r.bottom; 92dd4b1fec4c93c7417314febecebfd91e916f5ff6Romain Guy } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne @Override 9674d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy public boolean equals(Object o) { 9774d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy if (this == o) return true; 9874d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy if (o == null || getClass() != o.getClass()) return false; 9974d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy 10074d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy Rect r = (Rect) o; 10174d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy return left == r.left && top == r.top && right == r.right && bottom == r.bottom; 10274d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy } 10374d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy 10474d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy @Override 10574d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy public int hashCode() { 10674d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy int result = left; 10774d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy result = 31 * result + top; 10874d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy result = 31 * result + right; 10974d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy result = 31 * result + bottom; 11074d7ca133a6db82abba5c0abe443fb001928e72cRomain Guy return result; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne @Override 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn StringBuilder sb = new StringBuilder(32); 1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("Rect("); sb.append(left); sb.append(", "); 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(top); sb.append(" - "); sb.append(right); 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(", "); sb.append(bottom); sb.append(")"); 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return sb.toString(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a string representation of the rectangle in a compact form. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toShortString() { 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return toShortString(new StringBuilder(32)); 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn /** 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * Return a string representation of the rectangle in a compact form. 1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * @hide 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn */ 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public String toShortString(StringBuilder sb) { 1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append('['); sb.append(left); sb.append(','); 1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(top); sb.append("]["); sb.append(right); 1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(','); sb.append(bottom); sb.append(']'); 1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return sb.toString(); 1391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 140c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato 141c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato /** 142c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * Return a string representation of the rectangle in a well-defined format. 143c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * 144c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * <p>You can later recover the Rect from this string through 145c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * {@link #unflattenFromString(String)}. 146c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * 147c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * @return Returns a new String of the form "left top right bottom" 148c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato */ 149c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato public String flattenToString() { 150c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato StringBuilder sb = new StringBuilder(32); 151c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato // WARNING: Do not change the format of this string, it must be 152c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato // preserved because Rects are saved in this flattened format. 153c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(left); 154c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(' '); 155c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(top); 156c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(' '); 157c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(right); 158c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(' '); 159c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato sb.append(bottom); 160c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato return sb.toString(); 161c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato } 162c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato 163c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato /** 164c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * Returns a Rect from a string of the form returned by {@link #flattenToString}, 165c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato * or null if the string is not of that form. 166c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato */ 167c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato public static Rect unflattenFromString(String str) { 1685d5d14fd97aa8d7adf00911a9b337b9a88da41cdIan Rogers Matcher matcher = UnflattenHelper.getMatcher(str); 169c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato if (!matcher.matches()) { 170c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato return null; 171c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato } 172c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato return new Rect(Integer.parseInt(matcher.group(1)), 173c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato Integer.parseInt(matcher.group(2)), 174c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato Integer.parseInt(matcher.group(3)), 175c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato Integer.parseInt(matcher.group(4))); 176c7a63eea8d3d346addaaf892b5bbe0aa80651640Joe Onorato } 1771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn /** 1791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * Print short representation to given writer. 1801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * @hide 1811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn */ 1821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void printShortString(PrintWriter pw) { 1831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print('['); pw.print(left); pw.print(','); 1841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(top); pw.print("]["); pw.print(right); 1851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(','); pw.print(bottom); pw.print(']'); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the rectangle is empty (left >= right or top >= bottom) 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isEmpty() { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return left >= right || top >= bottom; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the rectangle's width. This does not check for a valid rectangle 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e. left <= right) so the result may be negative. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int width() { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return right - left; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the rectangle's height. This does not check for a valid rectangle 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e. top <= bottom) so the result may be negative. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int height() { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bottom - top; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the horizontal center of the rectangle. If the computed value 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is fractional, this method returns the largest integer that is 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * less than the computed value. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int centerX() { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (left + right) >> 1; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the vertical center of the rectangle. If the computed value 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is fractional, this method returns the largest integer that is 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * less than the computed value. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int centerY() { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (top + bottom) >> 1; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the exact horizontal center of the rectangle as a float. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float exactCenterX() { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (left + right) * 0.5f; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the exact vertical center of the rectangle as a float. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float exactCenterY() { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (top + bottom) * 0.5f; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the rectangle to (0,0,0,0) 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEmpty() { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = right = top = bottom = 0; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the rectangle's coordinates to the specified values. Note: no range 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * checking is performed, so it is up to the caller to ensure that 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * left <= right and top <= bottom. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 255852be16790d099f95fb2c4fe7b316455662ee97fPin Ting * @param left The X coordinate of the left side of the rectangle 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The Y coordinate of the top of the rectangle 257852be16790d099f95fb2c4fe7b316455662ee97fPin Ting * @param right The X coordinate of the right side of the rectangle 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The Y coordinate of the bottom of the rectangle 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(int left, int top, int right, int bottom) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.left = left; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.top = top; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.right = right; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.bottom = bottom; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy the coordinates from src into this rectangle. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The rectangle whose coordinates are copied into this 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Rect src) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.left = src.left; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.top = src.top; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.right = src.right; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.bottom = src.bottom; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the rectangle by adding dx to its left and right coordinates, and 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * adding dy to its top and bottom coordinates. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add to the rectangle's left and right coordinates 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add to the rectangle's top and bottom coordinates 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offset(int dx, int dy) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left += dx; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top += dy; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right += dx; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom += dy; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the rectangle to a specific (left, top) position, 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * keeping its width and height the same. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param newLeft The new "left" coordinate for the rectangle 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param newTop The new "top" coordinate for the rectangle 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offsetTo(int newLeft, int newTop) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right += newLeft - left; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom += newTop - top; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = newLeft; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top = newTop; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inset the rectangle by (dx,dy). If dx is positive, then the sides are 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moved inwards, making the rectangle narrower. If dx is negative, then the 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sides are moved outwards, making the rectangle wider. The same holds true 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for dy and the top and bottom. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add(subtract) from the rectangle's left(right) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add(subtract) from the rectangle's top(bottom) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void inset(int dx, int dy) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left += dx; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top += dy; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right -= dx; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom -= dy; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if (x,y) is inside the rectangle. The left and top are 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * considered to be inside, while the right and bottom are not. This means 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that for a x,y to be contained: left <= x < right and top <= y < bottom. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An empty rectangle never contains any point. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The X coordinate of the point being tested for containment 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The Y coordinate of the point being tested for containment 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff (x,y) are contained by the rectangle, where containment 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means left <= x < right and top <= y < bottom 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean contains(int x, int y) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return left < right && top < bottom // check for empty first 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && x >= left && x < right && y >= top && y < bottom; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true iff the 4 specified sides of a rectangle are inside or equal 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to this rectangle. i.e. is this rectangle a superset of the specified 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. An empty rectangle never contains another rectangle. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle being tested for containment 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle being tested for containment 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle being tested for containment 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle being tested for containment 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff the the 4 specified sides of a rectangle are inside or 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * equal to this rectangle 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean contains(int left, int top, int right, int bottom) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check for empty first 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.left < this.right && this.top < this.bottom 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now check for containment 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && this.left <= left && this.top <= top 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && this.right >= right && this.bottom >= bottom; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true iff the specified rectangle r is inside or equal to this 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. An empty rectangle never contains another rectangle. 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The rectangle being tested for containment. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff the specified rectangle r is inside or equal to this 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean contains(Rect r) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check for empty first 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.left < this.right && this.top < this.bottom 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now check for containment 372cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy && left <= r.left && top <= r.top && right >= r.right && bottom >= r.bottom; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the rectangle specified by left,top,right,bottom intersects this 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle, return true and set this rectangle to that intersection, 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return false and do not change this rectangle. No check is 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * performed to see if either rectangle is empty. Note: To just test for 380cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne * intersection, use {@link #intersects(Rect, Rect)}. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle being intersected with this 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle being intersected with this rectangle 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle being intersected with this 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle being intersected with this 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the specified rectangle and this rectangle intersect 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (and this rectangle is then set to that intersection) else 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return false and do not change this rectangle. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3935b3edbde20b446ecbfebe5d6ad0dcd735473ac75Chet Haase @CheckResult 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean intersect(int left, int top, int right, int bottom) { 395cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.left < right && left < this.right && this.top < bottom && top < this.bottom) { 396cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.left < left) this.left = left; 397cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.top < top) this.top = top; 398cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.right > right) this.right = right; 399cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.bottom > bottom) this.bottom = bottom; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the specified rectangle intersects this rectangle, return true and set 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this rectangle to that intersection, otherwise return false and do not 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change this rectangle. No check is performed to see if either rectangle 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is empty. To just test for intersection, use intersects() 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The rectangle being intersected with this rectangle. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the specified rectangle and this rectangle intersect 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (and this rectangle is then set to that intersection) else 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return false and do not change this rectangle. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4165b3edbde20b446ecbfebe5d6ad0dcd735473ac75Chet Haase @CheckResult 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean intersect(Rect r) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intersect(r.left, r.top, r.right, r.bottom); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If rectangles a and b intersect, return true and set this rectangle to 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that intersection, otherwise return false and do not change this 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle. No check is performed to see if either rectangle is empty. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To just test for intersection, use intersects() 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The first rectangle being intersected with 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b The second rectangle being intersected with 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff the two specified rectangles intersect. If they do, set 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this rectangle to that intersection. If they do not, return 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false and do not change this rectangle. 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4335b3edbde20b446ecbfebe5d6ad0dcd735473ac75Chet Haase @CheckResult 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setIntersect(Rect a, Rect b) { 435cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = Math.max(a.left, b.left); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top = Math.max(a.top, b.top); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right = Math.min(a.right, b.right); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom = Math.min(a.bottom, b.bottom); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if this rectangle intersects the specified rectangle. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In no event is this rectangle modified. No check is performed to see 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if either rectangle is empty. To record the intersection, use intersect() 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or setIntersect(). 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of the rectangle being tested for intersection 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of the rectangle being tested for intersection 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of the rectangle being tested for 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersection 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of the rectangle being tested for intersection 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff the specified rectangle intersects this rectangle. In 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no event is this rectangle modified. 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean intersects(int left, int top, int right, int bottom) { 460cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy return this.left < right && left < this.right && this.top < bottom && top < this.bottom; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true iff the two specified rectangles intersect. In no event are 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either of the rectangles modified. To record the intersection, 466cc3ec6cdb2b892eb29513e72d8b205acbe997b25Gilles Debunne * use {@link #intersect(Rect)} or {@link #setIntersect(Rect, Rect)}. 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The first rectangle being tested for intersection 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b The second rectangle being tested for intersection 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true iff the two specified rectangles intersect. In no event are 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either of the rectangles modified. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean intersects(Rect a, Rect b) { 474cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update this Rect to enclose itself and the specified rectangle. If the 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified rectangle is empty, nothing is done. If this rectangle is empty 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is set to the specified rectangle. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left edge being unioned with this rectangle 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top edge being unioned with this rectangle 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right edge being unioned with this rectangle 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom edge being unioned with this rectangle 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void union(int left, int top, int right, int bottom) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((left < right) && (top < bottom)) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((this.left < this.right) && (this.top < this.bottom)) { 490cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.left > left) this.left = left; 491cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.top > top) this.top = top; 492cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.right < right) this.right = right; 493cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy if (this.bottom < bottom) this.bottom = bottom; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.left = left; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.top = top; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.right = right; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.bottom = bottom; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update this Rect to enclose itself and the specified rectangle. If the 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified rectangle is empty, nothing is done. If this rectangle is empty 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is set to the specified rectangle. 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The rectangle being unioned with this rectangle 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void union(Rect r) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project union(r.left, r.top, r.right, r.bottom); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update this Rect to enclose itself and the [x,y] coordinate. There is no 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * check to see that this rectangle is non-empty. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x coordinate of the point to add to the rectangle 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y coordinate of the point to add to the rectangle 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void union(int x, int y) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x < left) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = x; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (x > right) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right = x; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y < top) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top = y; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (y > bottom) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom = y; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Swap top/bottom or left/right if there are flipped (i.e. left > right 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or top > bottom). This can be called if 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the edges are computed separately, and may have crossed over each other. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the edges are already correct (i.e. left <= right and top <= bottom) 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then nothing is done. 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sort() { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (left > right) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int temp = left; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = right; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right = temp; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (top > bottom) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int temp = top; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top = bottom; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom = temp; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable interface methods 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write this rectangle to the specified parcel. To restore a rectangle from 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, use readFromParcel() 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out The parcel to write the rectangle's coordinates into 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(left); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(top); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(right); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(bottom); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Rect> CREATOR = new Parcelable.Creator<Rect>() { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a new rectangle from the data in the specified parcel. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect createFromParcel(Parcel in) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r = new Rect(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.readFromParcel(in); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an array of rectangles of the specified size. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect[] newArray(int size) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Rect[size]; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the rectangle's coordinates from the data stored in the specified 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parcel. To write a rectangle to a parcel, call writeToParcel(). 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in The parcel to read the rectangle's coordinates from 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project left = in.readInt(); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project top = in.readInt(); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project right = in.readInt(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottom = in.readInt(); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6038169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 6048169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima /** 6058169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima * Scales up the rect by the given scale. 6068169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima * @hide 6078169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima */ 6088169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima public void scale(float scale) { 6098169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima if (scale != 1.0f) { 61061324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima left = (int) (left * scale + 0.5f); 61161324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima top = (int) (top * scale + 0.5f); 61261324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima right = (int) (right * scale + 0.5f); 61361324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima bottom = (int) (bottom * scale + 0.5f); 6148169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima } 6158169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima } 61647cd8e921db73e894f94ec4729ade90da50996f5Chris Craik 61747cd8e921db73e894f94ec4729ade90da50996f5Chris Craik /** 61847cd8e921db73e894f94ec4729ade90da50996f5Chris Craik * Scales up the rect by the given scale, rounding values toward the inside. 61947cd8e921db73e894f94ec4729ade90da50996f5Chris Craik * @hide 62047cd8e921db73e894f94ec4729ade90da50996f5Chris Craik */ 62147cd8e921db73e894f94ec4729ade90da50996f5Chris Craik public void scaleRoundIn(float scale) { 62247cd8e921db73e894f94ec4729ade90da50996f5Chris Craik if (scale != 1.0f) { 62347cd8e921db73e894f94ec4729ade90da50996f5Chris Craik left = (int) Math.ceil(left * scale); 62447cd8e921db73e894f94ec4729ade90da50996f5Chris Craik top = (int) Math.ceil(top * scale); 62547cd8e921db73e894f94ec4729ade90da50996f5Chris Craik right = (int) Math.floor(right * scale); 62647cd8e921db73e894f94ec4729ade90da50996f5Chris Craik bottom = (int) Math.floor(bottom * scale); 62747cd8e921db73e894f94ec4729ade90da50996f5Chris Craik } 62847cd8e921db73e894f94ec4729ade90da50996f5Chris Craik } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 630