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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 21545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganovimport android.util.Pools.SynchronizedPool; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Region implements Parcelable { 24545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 25545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov private static final int MAX_POOL_SIZE = 10; 26545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 27545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov private static final SynchronizedPool<Region> sPool = 28545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov new SynchronizedPool<Region>(MAX_POOL_SIZE); 29545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 3061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy /** 3161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy * @hide 3261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy */ 3336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat public final long mNativeRegion; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the native values for these must match up with the enum in SkRegion.h 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Op { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DIFFERENCE(0), 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INTERSECT(1), 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UNION(2), 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XOR(3), 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REVERSE_DIFFERENCE(4), 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REPLACE(5); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Op(int nativeInt) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 48079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy /** 49079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy * @hide 50079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy */ 51079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy public final int nativeInt; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Create an empty region 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region() { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(nativeConstructor()); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return a copy of the specified region 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region(Region region) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(nativeConstructor()); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeSetRegion(mNativeRegion, region.mNativeRegion); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return a region set to the specified rectangle 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region(Rect r) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeRegion = nativeConstructor(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeSetRect(mNativeRegion, r.left, r.top, r.right, r.bottom); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return a region set to the specified rectangle 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region(int left, int top, int right, int bottom) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeRegion = nativeConstructor(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeSetRect(mNativeRegion, left, top, right, bottom); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Set the region to the empty region 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEmpty() { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeSetRect(mNativeRegion, 0, 0, 0, 0); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Set the region to the specified region. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean set(Region region) { 90250f8ef24830498c2e1753d3a562ae50e609815bDerek Sollenberger nativeSetRegion(mNativeRegion, region.mNativeRegion); 91250f8ef24830498c2e1753d3a562ae50e609815bDerek Sollenberger return true; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Set the region to the specified rectangle 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean set(Rect r) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeSetRect(mNativeRegion, r.left, r.top, r.right, r.bottom); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Set the region to the specified rectangle 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean set(int left, int top, int right, int bottom) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeSetRect(mNativeRegion, left, top, right, bottom); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the region to the area described by the path and clip. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the resulting region is non-empty. This produces a region 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is identical to the pixels that would be drawn by the path 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (with no antialiasing). 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setPath(Path path, Region clip) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeSetPath(mNativeRegion, path.ni(), clip.mNativeRegion); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if this region is empty 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isEmpty(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region contains a single rectangle 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isRect(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region contains more than one rectangle 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isComplex(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a new Rect set to the bounds of the region. If the region is 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * empty, the Rect will be set to [0, 0, 0, 0] 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect getBounds() { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r = new Rect(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeGetBounds(mNativeRegion, r); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the Rect to the bounds of the region. If the region is empty, the 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rect will be set to [0, 0, 0, 0] 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBounds(Rect r) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r == null) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeGetBounds(mNativeRegion, r); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the boundary of the region as a new Path. If the region is empty, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the path will also be empty. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Path getBoundaryPath() { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Path path = new Path(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeGetBoundaryPath(mNativeRegion, path.ni()); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return path; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the path to the boundary of the region. If the region is empty, the 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path will also be empty. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBoundaryPath(Path path) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeGetBoundaryPath(mNativeRegion, path.ni()); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region contains the specified point 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean contains(int x, int y); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region is a single rectangle (not complex) and it 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains the specified rectangle. Returning false is not a guarantee 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the rectangle is not contained by this region, but return true is a 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * guarantee that the rectangle is contained by this region. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean quickContains(Rect r) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return quickContains(r.left, r.top, r.right, r.bottom); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region is a single rectangle (not complex) and it 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains the specified rectangle. Returning false is not a guarantee 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the rectangle is not contained by this region, but return true is a 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * guarantee that the rectangle is contained by this region. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean quickContains(int left, int top, int right, 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bottom); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region is empty, or if the specified rectangle does 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not intersect the region. Returning false is not a guarantee that they 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersect, but returning true is a guarantee that they do not. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean quickReject(Rect r) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return quickReject(r.left, r.top, r.right, r.bottom); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region is empty, or if the specified rectangle does 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not intersect the region. Returning false is not a guarantee that they 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersect, but returning true is a guarantee that they do not. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean quickReject(int left, int top, int right, int bottom); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the region is empty, or if the specified region does not 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersect the region. Returning false is not a guarantee that they 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersect, but returning true is a guarantee that they do not. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean quickReject(Region rgn); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Translate the region by [dx, dy]. If the region is empty, do nothing. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void translate(int dx, int dy) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translate(dx, dy, null); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the dst region to the result of translating this region by [dx, dy]. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this region is empty, then dst will be set to empty. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void translate(int dx, int dy, Region dst); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima /** 231b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * Scale the region by the given scale amount. This re-constructs new region by 232b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * scaling the rects that this region consists of. New rectis are computed by scaling 233b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * coordinates by float, then rounded by roundf() function to integers. This may results 234b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * in less internal rects if 0 < scale < 1. Zero and Negative scale result in 235b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * an empty region. If this region is empty, do nothing. 236b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * 237b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * @hide 238b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima */ 239b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima public void scale(float scale) { 240b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima scale(scale, null); 241b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima } 242b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 243b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima /** 244b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * Set the dst region to the result of scaling this region by the given scale amount. 245b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * If this region is empty, then dst will be set to empty. 246b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima * @hide 247b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima */ 248b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima public native void scale(float scale, Region dst); 249b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean union(Rect r) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op(r, Op.UNION); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Perform the specified Op on this region and the specified rect. Return 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true if the result of the op is not empty. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean op(Rect r, Op op) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeOp(mNativeRegion, r.left, r.top, r.right, r.bottom, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.nativeInt); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Perform the specified Op on this region and the specified rect. Return 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true if the result of the op is not empty. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean op(int left, int top, int right, int bottom, Op op) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeOp(mNativeRegion, left, top, right, bottom, 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.nativeInt); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Perform the specified Op on this region and the specified region. Return 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true if the result of the op is not empty. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean op(Region region, Op op) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op(this, region, op); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this region to the result of performing the Op on the specified rect 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and region. Return true if the result is not empty. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean op(Rect rect, Region region, Op op) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeOp(mNativeRegion, rect, region.mNativeRegion, 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project op.nativeInt); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this region to the result of performing the Op on the specified 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * regions. Return true if the result is not empty. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean op(Region region1, Region region2, Op op) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeOp(mNativeRegion, region1.mNativeRegion, 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region2.mNativeRegion, op.nativeInt); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 298120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato public String toString() { 299120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato return nativeToString(mNativeRegion); 300120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato } 301120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato 302545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov /** 303545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @return An instance from a pool if such or a new one. 304545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * 305545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @hide 306545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov */ 307545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov public static Region obtain() { 308545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov Region region = sPool.acquire(); 309545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov return (region != null) ? region : new Region(); 310545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 311545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 312545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov /** 313545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @return An instance from a pool if such or a new one. 314545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * 315545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @param other Region to copy values from for initialization. 316545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * 317545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @hide 318545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov */ 319545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov public static Region obtain(Region other) { 320545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov Region region = obtain(); 321545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov region.set(other); 322545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov return region; 323545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 324545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 325545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov /** 326545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * Recycles an instance. 327545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * 328545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov * @hide 329545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov */ 330545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov public void recycle() { 331545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov setEmpty(); 332545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov sPool.release(this); 333545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov } 334545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ////////////////////////////////////////////////////////////////////////// 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Region> CREATOR 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<Region>() { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rebuild a Region previously stored with writeToParcel(). 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p Parcel object to read the region from 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new region created from the data in the parcel 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region createFromParcel(Parcel p) { 34536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long ni = nativeCreateFromParcel(p); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ni == 0) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Region(ni); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region[] newArray(int size) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Region[size]; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write the region and its pixels to the parcel. The region can be 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rebuilt from the parcel by calling CREATOR.createFromParcel(). 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p Parcel object to write the region data into 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel p, int flags) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!nativeWriteToParcel(mNativeRegion, p)) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 370b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 371b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima @Override 372b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima public boolean equals(Object obj) { 373b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima if (obj == null || !(obj instanceof Region)) { 374b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima return false; 375b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima } 376b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima Region peer = (Region) obj; 377b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima return nativeEquals(mNativeRegion, peer.mNativeRegion); 378b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima } 379b10f138e125b5656e810901d14c5f956ff5d9b64Mitsuru Oshima 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 38161c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy try { 38261c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy nativeDestructor(mNativeRegion); 38361c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy } finally { 38461c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy super.finalize(); 38561c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat Region(long ni) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ni == 0) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeRegion = ni; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* add dummy parameter so constructor can be called from jni without 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project triggering 'not cloneable' exception */ 39736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private Region(long ni, int dummy) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(ni); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat final long ni() { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNativeRegion; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeEquals(long native_r1, long native_r2); 406120856c50a56595c0954ae1bf6f05888386937b9Joe Onorato 40736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native long nativeConstructor(); 40836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeDestructor(long native_region); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void nativeSetRegion(long native_dst, long native_src); 41136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeSetRect(long native_dst, int left, 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int top, int right, int bottom); 41336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeSetPath(long native_dst, long native_path, 41436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long native_clip); 41536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeGetBounds(long native_region, Rect rect); 41636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeGetBoundaryPath(long native_region, 41736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long native_path); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeOp(long native_dst, int left, int top, 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int right, int bottom, int op); 42136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeOp(long native_dst, Rect rect, 42236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long native_region, int op); 42336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeOp(long native_dst, long native_region1, 42436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long native_region2, int op); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native long nativeCreateFromParcel(Parcel p); 42736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean nativeWriteToParcel(long native_region, 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native String nativeToString(long native_region); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 432