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 java.awt.Shape; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.AffineTransform; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Ellipse2D; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.GeneralPath; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.PathIterator; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Rectangle2D; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Path class encapsulates compound (multiple contour) geometric paths 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * consisting of straight line segments, quadratic curves, and cubic curves. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It can be drawn with canvas.drawPath(path, paint), either filled or stroked 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (based on the paint's Style), or it can be used for clipping or to draw 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * text on a path. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Path { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private FillType mFillType = FillType.WINDING; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private GeneralPath mPath = new GeneralPath(); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mLastX = 0; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mLastY = 0; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //---------- Custom methods ---------- 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Shape getAwtShape() { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPath; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //---------- 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create an empty path 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Path() { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new path, copying the contents from the src path. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to copy from when initializing the new path 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Path(Path src) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.append(src.mPath, false /* connect */); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clear any lines and curves from the path, making it empty. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This does NOT change the fill-type setting. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath = new GeneralPath(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rewinds the path: clears any lines and curves from the path but 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * keeps the internal data structure for faster reuse. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rewind() { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Replace the contents of this with the contents of src. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Path src) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.append(src.mPath, false /* connect */); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Enum for the ways a path may be filled 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum FillType { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these must match the values in SkPath.h 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WINDING (GeneralPath.WIND_NON_ZERO, false), 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVEN_ODD (GeneralPath.WIND_EVEN_ODD, false), 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVERSE_WINDING (GeneralPath.WIND_NON_ZERO, true), 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVERSE_EVEN_ODD(GeneralPath.WIND_EVEN_ODD, true); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FillType(int rule, boolean inverse) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.rule = rule; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.inverse = inverse; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int rule; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean inverse; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the path's fill type. This defines how "inside" is 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * computed. The default value is WINDING. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the path's fill type 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FillType getFillType() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFillType; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the path's fill type. This defines how "inside" is computed. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ft The new fill type for this path 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFillType(FillType ft) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFillType = ft; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.setWindingRule(ft.rule); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the filltype is one of the INVERSE variants 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the filltype is one of the INVERSE variants 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isInverseFillType() { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFillType.inverse; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Toggles the INVERSE state of the filltype 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggleInverseFillType() { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mFillType) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WINDING: 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFillType = FillType.INVERSE_WINDING; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVEN_ODD: 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFillType = FillType.INVERSE_EVEN_ODD; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVERSE_WINDING: 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFillType = FillType.WINDING; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVERSE_EVEN_ODD: 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFillType = FillType.EVEN_ODD; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the path is empty (contains no lines or curves) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path is empty (contains no lines or curves) 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isEmpty() { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPath.getCurrentPoint() == null; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the path specifies a rectangle. If so, and if rect is 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not null, set rect to the bounds of the path. If the path does not 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specify a rectangle, return false and ignore rect. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect If not null, returns the bounds of the path if it specifies 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a rectangle 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the path specifies a rectangle 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isRect(RectF rect) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compute the bounds of the path, and write the answer into bounds. If the 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path contains 0 or 1 points, the bounds is set to (0,0,0,0) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds Returns the computed bounds of the path 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param exact If true, return the exact (but slower) bounds, else return 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * just the bounds of all control points 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void computeBounds(RectF bounds, boolean exact) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rectangle2D rect = mPath.getBounds2D(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.left = (float)rect.getMinX(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.right = (float)rect.getMaxX(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.top = (float)rect.getMinY(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.bottom = (float)rect.getMaxY(); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hint to the path to prepare for adding more points. This can allow the 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path to more efficiently allocate its storage. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extraPtCount The number of extra points that may be added to this 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incReserve(int extraPtCount) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the beginning of the next contour to the point (x,y). 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the start of a new contour 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the start of a new contour 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveTo(float x, float y) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.moveTo(mLastX = x, mLastY = y); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the beginning of the next contour relative to the last point on the 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour. If there is no previous contour, this is treated the 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * same as moveTo(). 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add to the x-coordinate of the end of the 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour, to specify the start of a new contour 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add to the y-coordinate of the end of the 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous contour, to specify the start of a new contour 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rMoveTo(float dx, float dy) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx += mLastX; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy += mLastY; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.moveTo(mLastX = dx, mLastY = dy); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a line from the last point to the specified point (x,y). 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If no moveTo() call has been made for this contour, the first point is 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically set to (0,0). 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the end of a line 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the end of a line 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void lineTo(float x, float y) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.lineTo(mLastX = x, mLastY = y); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as lineTo, but the coordinates are considered relative to the last 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * point on this contour. If there is no previous point, then a moveTo(0,0) 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inserted automatically. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to add to the x-coordinate of the previous point on 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, to specify a line 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount to add to the y-coordinate of the previous point on 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, to specify a line 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rLineTo(float dx, float dy) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isEmpty()) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.moveTo(mLastX = 0, mLastY = 0); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx += mLastX; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy += mLastY; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.lineTo(mLastX = dx, mLastY = dy); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a quadratic bezier from the last point, approaching control point 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, the first point is automatically set to (0,0). 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 The x-coordinate of the control point on a quadratic curve 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 The y-coordinate of the control point on a quadratic curve 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x2 The x-coordinate of the end point on a quadratic curve 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y2 The y-coordinate of the end point on a quadratic curve 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void quadTo(float x1, float y1, float x2, float y2) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.quadTo(x1, y1, mLastX = x2, mLastY = y2); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as quadTo, but the coordinates are considered relative to the last 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * point on this contour. If there is no previous point, then a moveTo(0,0) 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inserted automatically. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx1 The amount to add to the x-coordinate of the last point on 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the control point of a quadratic curve 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy1 The amount to add to the y-coordinate of the last point on 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the control point of a quadratic curve 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx2 The amount to add to the x-coordinate of the last point on 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the end point of a quadratic curve 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy2 The amount to add to the y-coordinate of the last point on 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this contour, for the end point of a quadratic curve 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rQuadTo(float dx1, float dy1, float dx2, float dy2) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isEmpty()) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.moveTo(mLastX = 0, mLastY = 0); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx1 += mLastX; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy1 += mLastY; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx2 += mLastX; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy2 += mLastY; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.quadTo(dx1, dy1, mLastX = dx2, mLastY = dy2); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a cubic bezier from the last point, approaching control points 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made for this contour, the first point is automatically set to (0,0). 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 The x-coordinate of the 1st control point on a cubic curve 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 The y-coordinate of the 1st control point on a cubic curve 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x2 The x-coordinate of the 2nd control point on a cubic curve 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y2 The y-coordinate of the 2nd control point on a cubic curve 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x3 The x-coordinate of the end point on a cubic curve 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y3 The y-coordinate of the end point on a cubic curve 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void cubicTo(float x1, float y1, float x2, float y2, 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float x3, float y3) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.curveTo(x1, y1, x2, y2, mLastX = x3, mLastY = y3); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as cubicTo, but the coordinates are considered relative to the 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current point on this contour. If there is no previous point, then a 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moveTo(0,0) is inserted automatically. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void rCubicTo(float dx1, float dy1, float dx2, float dy2, 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float dx3, float dy3) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isEmpty()) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.moveTo(mLastX = 0, mLastY = 0); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx1 += mLastX; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy1 += mLastY; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx2 += mLastX; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy2 += mLastY; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx3 += mLastX; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy3 += mLastY; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.curveTo(dx1, dy1, dx2, dy2, mLastX = dx3, mLastY = dy3); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Append the specified arc to the path as a new contour. If the start of 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the path is different from the path's current last point, then an 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatic lineTo() is added to connect the current contour to the 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start of the arc. However, if the path is empty, then we call moveTo() 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the first point of the arc. The sweep angle is tread mod 360. 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining shape and size of the arc 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise, treated 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mod 360. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param forceMoveTo If true, always begin a new contour with the arc 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void arcTo(RectF oval, float startAngle, float sweepAngle, 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean forceMoveTo) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Append the specified arc to the path as a new contour. If the start of 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the path is different from the path's current last point, then an 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatic lineTo() is added to connect the current contour to the 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start of the arc. However, if the path is empty, then we call moveTo() 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the first point of the arc. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining shape and size of the arc 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void arcTo(RectF oval, float startAngle, float sweepAngle) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Close the current contour. If the current point is not equal to the 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * first point of the contour, a line segment is automatically added. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.closePath(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies how closed shapes (e.g. rects, ovals) are oriented when they 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are added to a path. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum Direction { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** clockwise */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CW (0), // must match enum in SkPath.h 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** counter-clockwise */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CCW (1); // must match enum in SkPath.h 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Direction(int ni) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeInt = ni; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed rectangle contour to the path 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The rectangle to add as a closed contour to the path 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the rectangle's contour 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRect(RectF rect, Direction dir) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addRect(rect.left, rect.top, rect.right, rect.bottom, dir); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed rectangle contour to the path 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left side of a rectangle to add to the path 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top The top of a rectangle to add to the path 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right side of a rectangle to add to the path 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom The bottom of a rectangle to add to the path 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the rectangle's contour 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRect(float left, float top, float right, float bottom, 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Direction dir) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveTo(left, top); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (dir) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CW: 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(right, top); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(right, bottom); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(left, bottom); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CCW: 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(left, bottom); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(right, bottom); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineTo(right, top); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed oval contour to the path 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of the oval to add as a closed contour to the path 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the oval's contour 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addOval(RectF oval, Direction dir) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oval == null) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need oval parameter"); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME Need to support direction 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ellipse2D ovalShape = new Ellipse2D.Float(oval.left, oval.top, oval.width(), oval.height()); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.append(ovalShape, false /* connect */); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed circle contour to the path 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x The x-coordinate of the center of a circle to add to the path 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y The y-coordinate of the center of a circle to add to the path 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param radius The radius of a circle to add to the path 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the circle's contour 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCircle(float x, float y, float radius, Direction dir) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add the specified arc to the path as a new contour. 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param oval The bounds of oval defining the shape and size of the arc 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startAngle Starting angle (in degrees) where the arc begins 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sweepAngle Sweep angle (in degrees) measured clockwise 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addArc(RectF oval, float startAngle, float sweepAngle) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oval == null) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need oval parameter"); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed round-rectangle contour to the path 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The bounds of a round-rectangle to add to the path 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rx The x-radius of the rounded corners on the round-rectangle 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ry The y-radius of the rounded corners on the round-rectangle 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the round-rectangle's contour 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRoundRect(RectF rect, float rx, float ry, Direction dir) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a closed round-rectangle contour to the path. Each corner receives 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two radius values [X, Y]. The corners are ordered top-left, top-right, 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bottom-right, bottom-left 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect The bounds of a round-rectangle to add to the path 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param radii Array of 8 values, 4 pairs of [X,Y] radii 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dir The direction to wind the round-rectangle's contour 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addRoundRect(RectF rect, float[] radii, Direction dir) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rect == null) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("need rect parameter"); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (radii.length < 8) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values"); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path, offset by (dx,dy) 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to add as a new contour 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount to translate the path in X as it is added 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src, float dx, float dy) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PathIterator iterator = src.mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy)); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath.append(iterator, false /* connect */); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path that is appended to the current path 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addPath(src, 0, 0); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a copy of src to the path, transformed by matrix 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src The path to add as a new contour 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPath(Path src, Matrix matrix) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the path by (dx,dy), returning true on success 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount in the X direction to offset the entire path 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount in the Y direction to offset the entire path 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The translated path is written here. If this is null, then 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the original path is modified. 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offset(float dx, float dy, Path dst) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GeneralPath newPath = new GeneralPath(); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PathIterator iterator = mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy)); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newPath.append(iterator, false /* connect */); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst != null) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.mPath = newPath; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPath = newPath; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the path by (dx,dy), returning true on success 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The amount in the X direction to offset the entire path 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The amount in the Y direction to offset the entire path 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offset(float dx, float dy) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset(dx, dy, null /* dst */); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the last point of the path. 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dx The new X coordinate for the last point 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dy The new Y coordinate for the last point 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLastPoint(float dx, float dy) { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastX = dx; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastY = dy; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transform the points in this path by matrix, and write the answer 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into dst. If dst is null, then the the original path is modified. 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to apply to the path 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst The transformed path is written here. If dst is null, 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the the original path is modified 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void transform(Matrix matrix, Path dst) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transform the points in this path by matrix. 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param matrix The matrix to apply to the path 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void transform(Matrix matrix) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transform(matrix, null /* dst */); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 612