• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package android.util;
16 
17 import android.graphics.Path;
18 
19 import dalvik.annotation.optimization.FastNative;
20 
21 /**
22  * @hide
23  */
24 public class PathParser {
25     static final String LOGTAG = PathParser.class.getSimpleName();
26 
27     /**
28      * @param pathString The string representing a path, the same as "d" string in svg file.
29      * @return the generated Path object.
30      */
createPathFromPathData(String pathString)31     public static Path createPathFromPathData(String pathString) {
32         if (pathString == null) {
33             throw new IllegalArgumentException("Path string can not be null.");
34         }
35         Path path = new Path();
36         nParseStringForPath(path.mNativePath, pathString, pathString.length());
37         return path;
38     }
39 
40     /**
41      * Interpret PathData as path commands and insert the commands to the given path.
42      *
43      * @param data The source PathData to be converted.
44      * @param outPath The Path object where path commands will be inserted.
45      */
createPathFromPathData(Path outPath, PathData data)46     public static void createPathFromPathData(Path outPath, PathData data) {
47         nCreatePathFromPathData(outPath.mNativePath, data.mNativePathData);
48     }
49 
50     /**
51      * @param pathDataFrom The source path represented in PathData
52      * @param pathDataTo The target path represented in PathData
53      * @return whether the <code>nodesFrom</code> can morph into <code>nodesTo</code>
54      */
canMorph(PathData pathDataFrom, PathData pathDataTo)55     public static boolean canMorph(PathData pathDataFrom, PathData pathDataTo) {
56         return nCanMorph(pathDataFrom.mNativePathData, pathDataTo.mNativePathData);
57     }
58 
59     /**
60      * PathData class is a wrapper around the native PathData object, which contains
61      * the result of parsing a path string. Specifically, there are verbs and points
62      * associated with each verb stored in PathData. This data can then be used to
63      * generate commands to manipulate a Path.
64      */
65     public static class PathData {
66         long mNativePathData = 0;
PathData()67         public PathData() {
68             mNativePathData = nCreateEmptyPathData();
69         }
70 
PathData(PathData data)71         public PathData(PathData data) {
72             mNativePathData = nCreatePathData(data.mNativePathData);
73         }
74 
PathData(String pathString)75         public PathData(String pathString) {
76             mNativePathData = nCreatePathDataFromString(pathString, pathString.length());
77             if (mNativePathData == 0) {
78                 throw new IllegalArgumentException("Invalid pathData: " + pathString);
79             }
80         }
81 
getNativePtr()82         public long getNativePtr() {
83             return mNativePathData;
84         }
85 
86         /**
87          * Update the path data to match the source.
88          * Before calling this, make sure canMorph(target, source) is true.
89          *
90          * @param source The source path represented in PathData
91          */
setPathData(PathData source)92         public void setPathData(PathData source) {
93             nSetPathData(mNativePathData, source.mNativePathData);
94         }
95 
96         @Override
finalize()97         protected void finalize() throws Throwable {
98             if (mNativePathData != 0) {
99                 nFinalize(mNativePathData);
100                 mNativePathData = 0;
101             }
102             super.finalize();
103         }
104     }
105 
106     /**
107      * Interpolate between the <code>fromData</code> and <code>toData</code> according to the
108      * <code>fraction</code>, and put the resulting path data into <code>outData</code>.
109      *
110      * @param outData The resulting PathData of the interpolation
111      * @param fromData The start value as a PathData.
112      * @param toData The end value as a PathData
113      * @param fraction The fraction to interpolate.
114      */
interpolatePathData(PathData outData, PathData fromData, PathData toData, float fraction)115     public static boolean interpolatePathData(PathData outData, PathData fromData, PathData toData,
116             float fraction) {
117         return nInterpolatePathData(outData.mNativePathData, fromData.mNativePathData,
118                 toData.mNativePathData, fraction);
119     }
120 
121     // Native functions are defined below.
nParseStringForPath(long pathPtr, String pathString, int stringLength)122     private static native void nParseStringForPath(long pathPtr, String pathString,
123             int stringLength);
nCreatePathDataFromString(String pathString, int stringLength)124     private static native long nCreatePathDataFromString(String pathString, int stringLength);
125 
126     // ----------------- @FastNative -----------------------
127 
128     @FastNative
nCreatePathFromPathData(long outPathPtr, long pathData)129     private static native void nCreatePathFromPathData(long outPathPtr, long pathData);
130     @FastNative
nCreateEmptyPathData()131     private static native long nCreateEmptyPathData();
132     @FastNative
nCreatePathData(long nativePtr)133     private static native long nCreatePathData(long nativePtr);
134     @FastNative
nInterpolatePathData(long outDataPtr, long fromDataPtr, long toDataPtr, float fraction)135     private static native boolean nInterpolatePathData(long outDataPtr, long fromDataPtr,
136             long toDataPtr, float fraction);
137     @FastNative
nFinalize(long nativePtr)138     private static native void nFinalize(long nativePtr);
139     @FastNative
nCanMorph(long fromDataPtr, long toDataPtr)140     private static native boolean nCanMorph(long fromDataPtr, long toDataPtr);
141     @FastNative
nSetPathData(long outDataPtr, long fromDataPtr)142     private static native void nSetPathData(long outDataPtr, long fromDataPtr);
143 }
144 
145 
146