Path.java revision 36bef0bf30d6bae48cf3837df351075ca4fce654
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 Project/** 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Path class encapsulates compound (multiple contour) geometric paths 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * consisting of straight line segments, quadratic curves, and cubic curves. 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It can be drawn with canvas.drawPath(path, paint), either filled or stroked 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (based on the paint's Style), or it can be used for clipping or to draw 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text on a path. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Path { 2761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy /** 2861c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy * @hide 2961c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy */ 3036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat public final long mNativePath; 3136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private long mNativePathMeasure; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy * @hide 35a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy */ 36a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy public boolean isSimplePath = true; 37a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy /** 38a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy * @hide 39a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy */ 40a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy public Region rects; 41d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy private Direction mLastDirection = null; 42a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy 43a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy /** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create an empty path 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Path() { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativePath = init1(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new path, copying the contents from the src path. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to copy from when initializing the new path 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Path(Path src) { 5636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long valNative = 0; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src != null) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valNative = src.mNativePath; 59fa0853e0b92617128531188edd6a749a72b86432Chris Craik isSimplePath = src.isSimplePath; 60fa0853e0b92617128531188edd6a749a72b86432Chris Craik if (src.rects != null) { 61fa0853e0b92617128531188edd6a749a72b86432Chris Craik rects = new Region(src.rects); 62fa0853e0b92617128531188edd6a749a72b86432Chris Craik } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativePath = init2(valNative); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear any lines and curves from the path, making it empty. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This does NOT change the fill-type setting. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 72a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = true; 7302a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck mLastDirection = null; 7402a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck if (rects != null) rects.setEmpty(); 75d0f379c1976c600313f1f4c39f2587a649e3a4fcMike Klein // We promised not to change this, so preserve it around the native 76d0f379c1976c600313f1f4c39f2587a649e3a4fcMike Klein // call, which does now reset fill type. 77d0f379c1976c600313f1f4c39f2587a649e3a4fcMike Klein final FillType fillType = getFillType(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_reset(mNativePath); 79d0f379c1976c600313f1f4c39f2587a649e3a4fcMike Klein setFillType(fillType); 807fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 817fe03a267e6edb65142444765ce29ad5ff126052George Mount } 827fe03a267e6edb65142444765ce29ad5ff126052George Mount 837fe03a267e6edb65142444765ce29ad5ff126052George Mount private void clearMeasure() { 847fe03a267e6edb65142444765ce29ad5ff126052George Mount if (mNativePathMeasure != 0) { 857fe03a267e6edb65142444765ce29ad5ff126052George Mount native_destroyMeasure(mNativePathMeasure); 867fe03a267e6edb65142444765ce29ad5ff126052George Mount mNativePathMeasure = 0; 877fe03a267e6edb65142444765ce29ad5ff126052George Mount } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rewinds the path: clears any lines and curves from the path but 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * keeps the internal data structure for faster reuse. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rewind() { 95a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = true; 9602a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck mLastDirection = null; 9702a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck if (rects != null) rects.setEmpty(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_rewind(mNativePath); 997fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Replace the contents of this with the contents of src. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Path src) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this != src) { 106a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = src.isSimplePath; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_set(mNativePath, src.mNativePath); 1087fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1128018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1138018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * The logical operations that can be performed when combining two paths. 1148018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1158018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see #op(Path, android.graphics.Path.Op) 1168018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see #op(Path, Path, android.graphics.Path.Op) 1178018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1188018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy public enum Op { 1198018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1208018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Subtract the second path from the first path. 1218018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1228018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy DIFFERENCE, 1238018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1248018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Intersect the two paths. 1258018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1268018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy INTERSECT, 1278018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1288018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Union (inclusive-or) the two paths. 1298018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1308018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy UNION, 1318018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1328018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Exclusive-or the two paths. 1338018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1348018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy XOR, 1358018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1368018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Subtract the first path from the second path. 1378018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1388018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy REVERSE_DIFFERENCE 1398018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy } 1408018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy 1418018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1428018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Set this path to the result of applying the Op to this path and the specified path. 1438018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * The resulting path will be constructed from non-overlapping contours. 1448018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * The curve order is reduced where possible so that cubics may be turned 1458018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * into quadratics, and quadratics maybe turned into lines. 1468018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1478018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @param path The second operand (for difference, the subtrahend) 1488018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1498018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @return True if operation succeeded, false otherwise and this path remains unmodified. 1508018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1518018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see Op 1528018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see #op(Path, Path, android.graphics.Path.Op) 1538018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1548018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy public boolean op(Path path, Op op) { 1558018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy return op(this, path, op); 1568018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy } 1578018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy 1588018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1598018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Set this path to the result of applying the Op to the two specified paths. 1608018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * The resulting path will be constructed from non-overlapping contours. 1618018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * The curve order is reduced where possible so that cubics may be turned 1628018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * into quadratics, and quadratics maybe turned into lines. 1638018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1648018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @param path1 The first operand (for difference, the minuend) 1658018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @param path2 The second operand (for difference, the subtrahend) 1668018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1678018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @return True if operation succeeded, false otherwise and this path remains unmodified. 1688018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * 1698018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see Op 1708018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * @see #op(Path, android.graphics.Path.Op) 1718018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1728018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy public boolean op(Path path1, Path path2, Op op) { 1738018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy if (native_op(path1.mNativePath, path2.mNativePath, op.ordinal(), this.mNativePath)) { 1748018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy isSimplePath = false; 1758018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy rects = null; 1768018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy return true; 1778018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy } 1788018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy return false; 1798018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy } 1808018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy 1818018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1828018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Enum for the ways a path may be filled. 1838018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum FillType { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these must match the values in SkPath.h 1868018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1878018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Specifies that "inside" is computed by a non-zero sum of signed 1888018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * edge crossings. 1898018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WINDING (0), 1918018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1928018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Specifies that "inside" is computed by an odd number of edge 1938018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * crossings. 1948018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVEN_ODD (1), 1968018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 1978018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Same as {@link #WINDING}, but draws outside of the path, rather than inside. 1988018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVERSE_WINDING (2), 2008018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy /** 2018018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy * Same as {@link #EVEN_ODD}, but draws outside of the path, rather than inside. 2028018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVERSE_EVEN_ODD(3); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType(int ni) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeInt = ni; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2088018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2118018c8db8221aa604b3c083e09d173cc27e53d83Romain Guy 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these must be in the same order as their native values 2137f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet static final FillType[] sFillTypeArray = { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType.WINDING, 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType.EVEN_ODD, 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType.INVERSE_WINDING, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType.INVERSE_EVEN_ODD 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the path's fill type. This defines how "inside" is 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * computed. The default value is WINDING. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the path's fill type 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FillType getFillType() { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sFillTypeArray[native_getFillType(mNativePath)]; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the path's fill type. This defines how "inside" is computed. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ft The new fill type for this path 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFillType(FillType ft) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setFillType(mNativePath, ft.nativeInt); 2377fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the filltype is one of the INVERSE variants 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the filltype is one of the INVERSE variants 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isInverseFillType() { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int ft = native_getFillType(mNativePath); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (ft & 2) != 0; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Toggles the INVERSE state of the filltype 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggleInverseFillType() { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ft = native_getFillType(mNativePath); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ft ^= 2; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setFillType(mNativePath, ft); 2577fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the path is empty (contains no lines or curves) 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path is empty (contains no lines or curves) 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isEmpty() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_isEmpty(mNativePath); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the path specifies a rectangle. If so, and if rect is 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not null, set rect to the bounds of the path. If the path does not 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specify a rectangle, return false and ignore rect. 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect If not null, returns the bounds of the path if it specifies 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a rectangle 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path specifies a rectangle 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isRect(RectF rect) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return native_isRect(mNativePath, rect); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28354900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed * Compute the bounds of the control points of the path, and write the 28454900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed * answer into bounds. If the path contains 0 or 1 points, the bounds is 28554900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed * set to (0,0,0,0) 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28754900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed * @param bounds Returns the computed bounds of the path's control points. 28854900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed * @param exact This parameter is no longer used. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 290a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy @SuppressWarnings({"UnusedDeclaration"}) 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void computeBounds(RectF bounds, boolean exact) { 29254900e8c05e92a0783e8468ad7c4513eb66adc80Mike Reed native_computeBounds(mNativePath, bounds); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hint to the path to prepare for adding more points. This can allow the 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path to more efficiently allocate its storage. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extraPtCount The number of extra points that may be added to this 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incReserve(int extraPtCount) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_incReserve(mNativePath, extraPtCount); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the beginning of the next contour to the point (x,y). 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the start of a new contour 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the start of a new contour 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveTo(float x, float y) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_moveTo(mNativePath, x, y); 3147fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the beginning of the next contour relative to the last point on the 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour. If there is no previous contour, this is treated the 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * same as moveTo(). 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add to the x-coordinate of the end of the 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour, to specify the start of a new contour 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add to the y-coordinate of the end of the 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour, to specify the start of a new contour 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rMoveTo(float dx, float dy) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_rMoveTo(mNativePath, dx, dy); 3297fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a line from the last point to the specified point (x,y). 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If no moveTo() call has been made for this contour, the first point is 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically set to (0,0). 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the end of a line 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the end of a line 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void lineTo(float x, float y) { 341d79991277043d6bdbd90bb63fd8aff73ef9e06a5Romain Guy isSimplePath = false; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_lineTo(mNativePath, x, y); 3437fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as lineTo, but the coordinates are considered relative to the last 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * point on this contour. If there is no previous point, then a moveTo(0,0) 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inserted automatically. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add to the x-coordinate of the previous point on 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, to specify a line 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add to the y-coordinate of the previous point on 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, to specify a line 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rLineTo(float dx, float dy) { 357d79991277043d6bdbd90bb63fd8aff73ef9e06a5Romain Guy isSimplePath = false; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_rLineTo(mNativePath, dx, dy); 3597fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a quadratic bezier from the last point, approaching control point 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, the first point is automatically set to (0,0). 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 The x-coordinate of the control point on a quadratic curve 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 The y-coordinate of the control point on a quadratic curve 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x2 The x-coordinate of the end point on a quadratic curve 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y2 The y-coordinate of the end point on a quadratic curve 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void quadTo(float x1, float y1, float x2, float y2) { 373a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_quadTo(mNativePath, x1, y1, x2, y2); 3757fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as quadTo, but the coordinates are considered relative to the last 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * point on this contour. If there is no previous point, then a moveTo(0,0) 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inserted automatically. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx1 The amount to add to the x-coordinate of the last point on 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the control point of a quadratic curve 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy1 The amount to add to the y-coordinate of the last point on 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the control point of a quadratic curve 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx2 The amount to add to the x-coordinate of the last point on 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the end point of a quadratic curve 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy2 The amount to add to the y-coordinate of the last point on 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the end point of a quadratic curve 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rQuadTo(float dx1, float dy1, float dx2, float dy2) { 393a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_rQuadTo(mNativePath, dx1, dy1, dx2, dy2); 3957fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a cubic bezier from the last point, approaching control points 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made for this contour, the first point is automatically set to (0,0). 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 The x-coordinate of the 1st control point on a cubic curve 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 The y-coordinate of the 1st control point on a cubic curve 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x2 The x-coordinate of the 2nd control point on a cubic curve 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y2 The y-coordinate of the 2nd control point on a cubic curve 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x3 The x-coordinate of the end point on a cubic curve 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y3 The y-coordinate of the end point on a cubic curve 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void cubicTo(float x1, float y1, float x2, float y2, 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x3, float y3) { 412a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_cubicTo(mNativePath, x1, y1, x2, y2, x3, y3); 4147fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as cubicTo, but the coordinates are considered relative to the 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current point on this contour. If there is no previous point, then a 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moveTo(0,0) is inserted automatically. 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rCubicTo(float x1, float y1, float x2, float y2, 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x3, float y3) { 424a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_rCubicTo(mNativePath, x1, y1, x2, y2, x3, y3); 4267fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Append the specified arc to the path as a new contour. If the start of 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the path is different from the path's current last point, then an 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatic lineTo() is added to connect the current contour to the 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start of the arc. However, if the path is empty, then we call moveTo() 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the first point of the arc. The sweep angle is tread mod 360. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining shape and size of the arc 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise, treated 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mod 360. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param forceMoveTo If true, always begin a new contour with the arc 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void arcTo(RectF oval, float startAngle, float sweepAngle, 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean forceMoveTo) { 444a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_arcTo(mNativePath, oval, startAngle, sweepAngle, forceMoveTo); 4467fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Append the specified arc to the path as a new contour. If the start of 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the path is different from the path's current last point, then an 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatic lineTo() is added to connect the current contour to the 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start of the arc. However, if the path is empty, then we call moveTo() 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the first point of the arc. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining shape and size of the arc 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void arcTo(RectF oval, float startAngle, float sweepAngle) { 461a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_arcTo(mNativePath, oval, startAngle, sweepAngle, false); 4637fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Close the current contour. If the current point is not equal to the 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * first point of the contour, a line segment is automatically added. 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() { 471a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_close(mNativePath); 4737fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies how closed shapes (e.g. rects, ovals) are oriented when they 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are added to a path. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Direction { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** clockwise */ 48270336dd0eb4d06004687bfdeda0047b5675433e3Derek Sollenberger CW (1), // must match enum in SkPath.h 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** counter-clockwise */ 48470336dd0eb4d06004687bfdeda0047b5675433e3Derek Sollenberger CCW (2); // must match enum in SkPath.h 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Direction(int ni) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeInt = ni; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 492d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy private void detectSimplePath(float left, float top, float right, float bottom, Direction dir) { 49302a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck if (mLastDirection == null) { 49402a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck mLastDirection = dir; 49502a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck } 49602a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck if (mLastDirection != dir) { 49702a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck isSimplePath = false; 49802a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck } else { 49902a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck if (rects == null) rects = new Region(); 50002a2aab57c71f1058348cec0fc3a6aaa07250bc9John Reck rects.op((int) left, (int) top, (int) right, (int) bottom, Region.Op.UNION); 501d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy } 502d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy } 503d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed rectangle contour to the path 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangle to add as a closed contour to the path 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the rectangle's contour 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRect(RectF rect, Direction dir) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 514d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy detectSimplePath(rect.left, rect.top, rect.right, rect.bottom, dir); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addRect(mNativePath, rect, dir.nativeInt); 5167fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed rectangle contour to the path 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of a rectangle to add to the path 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of a rectangle to add to the path 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of a rectangle to add to the path 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of a rectangle to add to the path 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the rectangle's contour 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 528a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy public void addRect(float left, float top, float right, float bottom, Direction dir) { 529d4b5795e5efd05be7e482e013dfdec519ad2601eRomain Guy detectSimplePath(left, top, right, bottom, dir); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addRect(mNativePath, left, top, right, bottom, dir.nativeInt); 5317fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed oval contour to the path 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of the oval to add as a closed contour to the path 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the oval's contour 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addOval(RectF oval, Direction dir) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oval == null) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need oval parameter"); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 544a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addOval(mNativePath, oval, dir.nativeInt); 5467fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed circle contour to the path 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the center of a circle to add to the path 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the center of a circle to add to the path 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param radius The radius of a circle to add to the path 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the circle's contour 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCircle(float x, float y, float radius, Direction dir) { 558a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addCircle(mNativePath, x, y, radius, dir.nativeInt); 5607fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add the specified arc to the path as a new contour. 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining the shape and size of the arc 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addArc(RectF oval, float startAngle, float sweepAngle) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oval == null) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need oval parameter"); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 574a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addArc(mNativePath, oval, startAngle, sweepAngle); 5767fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed round-rectangle contour to the path 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The bounds of a round-rectangle to add to the path 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rx The x-radius of the rounded corners on the round-rectangle 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ry The y-radius of the rounded corners on the round-rectangle 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the round-rectangle's contour 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRoundRect(RectF rect, float rx, float ry, Direction dir) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 591a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addRoundRect(mNativePath, rect, rx, ry, dir.nativeInt); 5937fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed round-rectangle contour to the path. Each corner receives 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two radius values [X, Y]. The corners are ordered top-left, top-right, 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bottom-right, bottom-left 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The bounds of a round-rectangle to add to the path 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param radii Array of 8 values, 4 pairs of [X,Y] radii 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the round-rectangle's contour 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRoundRect(RectF rect, float[] radii, Direction dir) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (radii.length < 8) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values"); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 612a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addRoundRect(mNativePath, rect, radii, dir.nativeInt); 6147fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path, offset by (dx,dy) 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to add as a new contour 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to translate the path in X as it is added 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src, float dx, float dy) { 624a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addPath(mNativePath, src.mNativePath, dx, dy); 6267fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path that is appended to the current path 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src) { 635a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addPath(mNativePath, src.mNativePath); 6377fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path, transformed by matrix 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to add as a new contour 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src, Matrix matrix) { 646a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy if (!src.isSimplePath) isSimplePath = false; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_addPath(mNativePath, src.mNativePath, matrix.native_instance); 6487fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the path by (dx,dy), returning true on success 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount in the X direction to offset the entire path 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount in the Y direction to offset the entire path 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The translated path is written here. If this is null, then 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the original path is modified. 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offset(float dx, float dy, Path dst) { 66036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long dstNative = 0; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst != null) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstNative = dst.mNativePath; 663fa0853e0b92617128531188edd6a749a72b86432Chris Craik dst.isSimplePath = false; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_offset(mNativePath, dx, dy, dstNative); 6667fe03a267e6edb65142444765ce29ad5ff126052George Mount if (dst != null) { 6677fe03a267e6edb65142444765ce29ad5ff126052George Mount dst.clearMeasure(); 6687fe03a267e6edb65142444765ce29ad5ff126052George Mount } else { 6697fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6707fe03a267e6edb65142444765ce29ad5ff126052George Mount } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the path by (dx,dy), returning true on success 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount in the X direction to offset the entire path 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount in the Y direction to offset the entire path 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offset(float dx, float dy) { 680fa0853e0b92617128531188edd6a749a72b86432Chris Craik isSimplePath = false; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_offset(mNativePath, dx, dy); 6827fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the last point of the path. 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The new X coordinate for the last point 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The new Y coordinate for the last point 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLastPoint(float dx, float dy) { 692a48a1a87ba17f20f7006eaab21dcedf86c015c13Romain Guy isSimplePath = false; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_setLastPoint(mNativePath, dx, dy); 6947fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transform the points in this path by matrix, and write the answer 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into dst. If dst is null, then the the original path is modified. 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to apply to the path 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The transformed path is written here. If dst is null, 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the the original path is modified 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void transform(Matrix matrix, Path dst) { 70636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long dstNative = 0; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst != null) { 708fa0853e0b92617128531188edd6a749a72b86432Chris Craik dst.isSimplePath = false; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstNative = dst.mNativePath; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_transform(mNativePath, matrix.native_instance, dstNative); 7127fe03a267e6edb65142444765ce29ad5ff126052George Mount if (dst != null) { 7137fe03a267e6edb65142444765ce29ad5ff126052George Mount dst.clearMeasure(); 7147fe03a267e6edb65142444765ce29ad5ff126052George Mount } else { 7157fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 7167fe03a267e6edb65142444765ce29ad5ff126052George Mount } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transform the points in this path by matrix. 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to apply to the path 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void transform(Matrix matrix) { 725fa0853e0b92617128531188edd6a749a72b86432Chris Craik isSimplePath = false; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native_transform(mNativePath, matrix.native_instance); 7277fe03a267e6edb65142444765ce29ad5ff126052George Mount clearMeasure(); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7327fe03a267e6edb65142444765ce29ad5ff126052George Mount if (mNativePathMeasure != 0) { 7337fe03a267e6edb65142444765ce29ad5ff126052George Mount native_destroyMeasure(mNativePathMeasure); 7347fe03a267e6edb65142444765ce29ad5ff126052George Mount } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalizer(mNativePath); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74061c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy 74136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat final long ni() { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNativePath; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 745c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount /** 746c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * Approximate the <code>Path</code> with a series of line segments. 747c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * This returns float[] with the array containing point components. 748c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * There are three components for each point, in order: 749c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * <ul> 750c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * <li>Fraction along the length of the path that the point resides</li> 751c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * <li>The x coordinate of the point</li> 752c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * <li>The y coordinate of the point</li> 753c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * </ul> 754c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * <p>Two points may share the same fraction along its length when there is 755c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * a move action within the Path.</p> 756c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * 757c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * @param acceptableError The acceptable error for a line on the 758c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * Path. Typically this would be 0.5 so that 759c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * the error is less than half a pixel. 760c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * @return An array of components for points approximating the Path. 761c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount * @hide 762c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount */ 763c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount public float[] approximate(float acceptableError) { 764c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount return native_approximate(mNativePath, acceptableError); 765c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount } 766c96c7b2e54965e30c8fb82295f1ca9f891ebd5e7George Mount 7677fe03a267e6edb65142444765ce29ad5ff126052George Mount /** 7687fe03a267e6edb65142444765ce29ad5ff126052George Mount * Modifies the <code>Path</code> by extracting a portion of it. 7697fe03a267e6edb65142444765ce29ad5ff126052George Mount * The portion of the <code>Path</code> used is between <code>trimStart</code> and 7707fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>trimEnd</code> with the value offset by <code>trimOffset</code>. When 7717fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>trimOffset</code> added to <code>trimEnd</code> is greater than 1, the 7727fe03a267e6edb65142444765ce29ad5ff126052George Mount * trimmed portion "wraps" to the start of the <code>Path</code>. 7737fe03a267e6edb65142444765ce29ad5ff126052George Mount * <p>For example, if <code>Path</code> is a circle and <code>trimStart</code> is 0 7747fe03a267e6edb65142444765ce29ad5ff126052George Mount * and <code>trimEnd</code> is 0.5, the resulting <code>Path</code> is the arc of 7757fe03a267e6edb65142444765ce29ad5ff126052George Mount * a semicircle. If <code>trimOffset</code> is set to 0.75, the arc will start at 7767fe03a267e6edb65142444765ce29ad5ff126052George Mount * 3/4 of the circle and continue to the end of the circle, then start again at the 7777fe03a267e6edb65142444765ce29ad5ff126052George Mount * beginning of the circle and end at 1/4 of the way around. It will appear as if 7787fe03a267e6edb65142444765ce29ad5ff126052George Mount * the semicircle arc wrapped around the <code>Path</code> start and end.</p> 7797fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimStart A number between 0 and <code>trimEnd</code> indicating the fraction of the 7807fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>Path</code> to start. A value of 0 trims nothing from the start. 7817fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimEnd A number between <code>trimStart</code> and 1 indicating the fraction of the 7827fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>Path</code> to end. A value of 1 trims nothing from the end. 7837fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimOffset A fraction between 0 and 1 indicating the offset of the trimmed 7847fe03a267e6edb65142444765ce29ad5ff126052George Mount * portion of the <code>Path</code>. 7857fe03a267e6edb65142444765ce29ad5ff126052George Mount * @see #trim(float, float, float, Path) 7867fe03a267e6edb65142444765ce29ad5ff126052George Mount */ 7877fe03a267e6edb65142444765ce29ad5ff126052George Mount public void trim(float trimStart, float trimEnd, float trimOffset) { 7887fe03a267e6edb65142444765ce29ad5ff126052George Mount trim(trimStart, trimEnd, trimOffset, null); 7897fe03a267e6edb65142444765ce29ad5ff126052George Mount } 7907fe03a267e6edb65142444765ce29ad5ff126052George Mount 7917fe03a267e6edb65142444765ce29ad5ff126052George Mount /** 7927fe03a267e6edb65142444765ce29ad5ff126052George Mount * Extracts a portion of the <code>Path</code> and writes it to <code>dst</code>. 7937fe03a267e6edb65142444765ce29ad5ff126052George Mount * The portion of the <code>Path</code> used is between <code>trimStart</code> and 7947fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>trimEnd</code> with the value offset by <code>trimOffset</code>. When 7957fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>trimOffset</code> added to <code>trimEnd</code> is greater than 1, the 7967fe03a267e6edb65142444765ce29ad5ff126052George Mount * trimmed portion "wraps" to the start of the <code>Path</code>. 7977fe03a267e6edb65142444765ce29ad5ff126052George Mount * <p>For example, if <code>Path</code> is a circle and <code>trimStart</code> is 0 7987fe03a267e6edb65142444765ce29ad5ff126052George Mount * and <code>trimEnd</code> is 0.5, the resulting <code>Path</code> is the arc of 7997fe03a267e6edb65142444765ce29ad5ff126052George Mount * a semicircle. If <code>trimOffset</code> is set to 0.75, the arc will start at 8007fe03a267e6edb65142444765ce29ad5ff126052George Mount * 3/4 of the circle and continue to the end of the circle, then start again at the 8017fe03a267e6edb65142444765ce29ad5ff126052George Mount * beginning of the circle and end at 1/4 of the way around. It will appear as if 8027fe03a267e6edb65142444765ce29ad5ff126052George Mount * the semicircle arc wrapped around the <code>Path</code> start and end.</p> 8037fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimStart A number between 0 and <code>trimEnd</code> indicating the fraction of the 8047fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>Path</code> to start. A value of 0 trims nothing from the start. 8057fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimEnd A number between <code>trimStart</code> and 1 indicating the fraction of the 8067fe03a267e6edb65142444765ce29ad5ff126052George Mount * <code>Path</code> to end. A value of 1 trims nothing from the end. 8077fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param trimOffset A fraction between 0 and 1 indicating the offset of the trimmed 8087fe03a267e6edb65142444765ce29ad5ff126052George Mount * portion of the <code>Path</code>. 8097fe03a267e6edb65142444765ce29ad5ff126052George Mount * @param dst The trimmed <code>Path</code> is written here. If <code>dst</code> is null, 8107fe03a267e6edb65142444765ce29ad5ff126052George Mount * then the original <code>Path</code> is modified. 8117fe03a267e6edb65142444765ce29ad5ff126052George Mount * @see #trim(float, float, float) 8127fe03a267e6edb65142444765ce29ad5ff126052George Mount */ 8137fe03a267e6edb65142444765ce29ad5ff126052George Mount public void trim(float trimStart, float trimEnd, float trimOffset, Path dst) { 8147fe03a267e6edb65142444765ce29ad5ff126052George Mount if (trimStart > 1 || trimEnd > 1 || trimOffset > 1 8157fe03a267e6edb65142444765ce29ad5ff126052George Mount || trimStart < 0 || trimEnd < 0 || trimOffset < 0) { 8167fe03a267e6edb65142444765ce29ad5ff126052George Mount throw new IllegalArgumentException("trim must be between 0 and 1"); 8177fe03a267e6edb65142444765ce29ad5ff126052George Mount } 8187fe03a267e6edb65142444765ce29ad5ff126052George Mount if (trimStart > trimEnd) { 8197fe03a267e6edb65142444765ce29ad5ff126052George Mount throw new IllegalArgumentException("trim end cannot be less than start"); 8207fe03a267e6edb65142444765ce29ad5ff126052George Mount } 82136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long dstNative = 0; 8227fe03a267e6edb65142444765ce29ad5ff126052George Mount if (dst != null) { 8237fe03a267e6edb65142444765ce29ad5ff126052George Mount dstNative = dst.mNativePath; 8247fe03a267e6edb65142444765ce29ad5ff126052George Mount dst.isSimplePath = false; 8257fe03a267e6edb65142444765ce29ad5ff126052George Mount dst.clearMeasure(); 8267fe03a267e6edb65142444765ce29ad5ff126052George Mount } 8277fe03a267e6edb65142444765ce29ad5ff126052George Mount mNativePathMeasure = native_trim(mNativePath, dstNative, mNativePathMeasure, 8287fe03a267e6edb65142444765ce29ad5ff126052George Mount trimStart, trimEnd, trimOffset); 8297fe03a267e6edb65142444765ce29ad5ff126052George Mount } 8307fe03a267e6edb65142444765ce29ad5ff126052George Mount 83136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native long init1(); 83236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native long init2(long nPath); 83336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_reset(long nPath); 83436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_rewind(long nPath); 83536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_set(long native_dst, long native_src); 83636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native int native_getFillType(long nPath); 83736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_setFillType(long nPath, int ft); 83836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_isEmpty(long nPath); 83936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_isRect(long nPath, RectF rect); 84036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_computeBounds(long nPath, RectF bounds); 84136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_incReserve(long nPath, int extraPtCount); 84236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_moveTo(long nPath, float x, float y); 84336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_rMoveTo(long nPath, float dx, float dy); 84436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_lineTo(long nPath, float x, float y); 84536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_rLineTo(long nPath, float dx, float dy); 84636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_quadTo(long nPath, float x1, float y1, 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x2, float y2); 84836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_rQuadTo(long nPath, float dx1, float dy1, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float dx2, float dy2); 85036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_cubicTo(long nPath, float x1, float y1, 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x2, float y2, float x3, float y3); 85236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_rCubicTo(long nPath, float x1, float y1, 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x2, float y2, float x3, float y3); 85436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_arcTo(long nPath, RectF oval, 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float startAngle, float sweepAngle, boolean forceMoveTo); 85636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_close(long nPath); 85736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addRect(long nPath, RectF rect, int dir); 85836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addRect(long nPath, float left, float top, 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float right, float bottom, int dir); 86036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addOval(long nPath, RectF oval, int dir); 86136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addCircle(long nPath, float x, float y, float radius, int dir); 86236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addArc(long nPath, RectF oval, 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float startAngle, float sweepAngle); 86436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addRoundRect(long nPath, RectF rect, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float rx, float ry, int dir); 86636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addRoundRect(long nPath, RectF r, float[] radii, int dir); 86736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addPath(long nPath, long src, float dx, float dy); 86836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addPath(long nPath, long src); 86936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_addPath(long nPath, long src, long matrix); 87036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_offset(long nPath, float dx, float dy, long dst_path); 87136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_offset(long nPath, float dx, float dy); 87236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_setLastPoint(long nPath, float dx, float dy); 87336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_transform(long nPath, long matrix, long dst_path); 87436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_transform(long nPath, long matrix); 87536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native boolean native_op(long path1, long path2, int op, long result); 87636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void finalizer(long nPath); 87736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native float[] native_approximate(long nPath, float error); 87836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native int native_trim(long nPath, long nTargetPath, long nPathMeasure, 8797fe03a267e6edb65142444765ce29ad5ff126052George Mount float trimStart, float trimEnd, float trimOffset); 88036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private static native void native_destroyMeasure(long nPathMeasure); 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 882