diff options
author | Derek Sollenberger <djsollen@google.com> | 2020-02-21 11:43:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-02-21 11:43:02 +0000 |
commit | 76e7430baead21c67fd4c81a36774a6461d2fb99 (patch) | |
tree | 239a62b59c57b4b95d8e82943bf9a48e84439819 /libs/hwui/jni/android_util_PathParser.cpp | |
parent | 1ab8e44c06ca05806a81c6737cb3f6e316d8d25a (diff) | |
parent | 2173ea286afff6766043227de0bc2d82d9595f77 (diff) |
Merge changes from topic "HWUI_JNI"
* changes:
Export symbols for the newly exposed APEX/internal headers
Remove dependence on libandroid_runtime from Bitmap.cpp
Update Region.cpp to use AParcel NDK APIs
Cleanup header and build targets for libhwui clients.
Remove dependencies on headers outside UI module
Cleanup LOG_TAG when bundled in HWUI
Move android.graphics JNI & APEX files into HWUI
Diffstat (limited to 'libs/hwui/jni/android_util_PathParser.cpp')
-rw-r--r-- | libs/hwui/jni/android_util_PathParser.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/libs/hwui/jni/android_util_PathParser.cpp b/libs/hwui/jni/android_util_PathParser.cpp new file mode 100644 index 000000000000..df5e9cd44ed0 --- /dev/null +++ b/libs/hwui/jni/android_util_PathParser.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GraphicsJNI.h" + +#include <PathParser.h> +#include <SkPath.h> +#include <utils/VectorDrawableUtils.h> + +#include <android/log.h> + +namespace android { + +using namespace uirenderer; + +static void parseStringForPath(JNIEnv* env, jobject, jlong skPathHandle, jstring inputPathStr, + jint strLength) { + const char* pathString = env->GetStringUTFChars(inputPathStr, NULL); + SkPath* skPath = reinterpret_cast<SkPath*>(skPathHandle); + + PathParser::ParseResult result; + PathParser::parseAsciiStringForSkPath(skPath, &result, pathString, strLength); + env->ReleaseStringUTFChars(inputPathStr, pathString); + if (result.failureOccurred) { + doThrowIAE(env, result.failureMessage.c_str()); + } +} + +static long createEmptyPathData(JNIEnv*, jobject) { + PathData* pathData = new PathData(); + return reinterpret_cast<jlong>(pathData); +} + +static long createPathData(JNIEnv*, jobject, jlong pathDataPtr) { + PathData* pathData = reinterpret_cast<PathData*>(pathDataPtr); + PathData* newPathData = new PathData(*pathData); + return reinterpret_cast<jlong>(newPathData); +} + +static long createPathDataFromStringPath(JNIEnv* env, jobject, jstring inputStr, jint strLength) { + const char* pathString = env->GetStringUTFChars(inputStr, NULL); + PathData* pathData = new PathData(); + PathParser::ParseResult result; + PathParser::getPathDataFromAsciiString(pathData, &result, pathString, strLength); + env->ReleaseStringUTFChars(inputStr, pathString); + if (!result.failureOccurred) { + return reinterpret_cast<jlong>(pathData); + } else { + delete pathData; + doThrowIAE(env, result.failureMessage.c_str()); + return NULL; + } +} + +static bool interpolatePathData(JNIEnv*, jobject, jlong outPathDataPtr, jlong fromPathDataPtr, + jlong toPathDataPtr, jfloat fraction) { + PathData* outPathData = reinterpret_cast<PathData*>(outPathDataPtr); + PathData* fromPathData = reinterpret_cast<PathData*>(fromPathDataPtr); + PathData* toPathData = reinterpret_cast<PathData*>(toPathDataPtr); + return VectorDrawableUtils::interpolatePathData(outPathData, *fromPathData, + *toPathData, fraction); +} + +static void deletePathData(JNIEnv*, jobject, jlong pathDataHandle) { + PathData* pathData = reinterpret_cast<PathData*>(pathDataHandle); + delete pathData; +} + +static bool canMorphPathData(JNIEnv*, jobject, jlong fromPathDataPtr, jlong toPathDataPtr) { + PathData* fromPathData = reinterpret_cast<PathData*>(fromPathDataPtr); + PathData* toPathData = reinterpret_cast<PathData*>(toPathDataPtr); + return VectorDrawableUtils::canMorph(*fromPathData, *toPathData); +} + +static void setPathData(JNIEnv*, jobject, jlong outPathDataPtr, jlong fromPathDataPtr) { + PathData* fromPathData = reinterpret_cast<PathData*>(fromPathDataPtr); + PathData* outPathData = reinterpret_cast<PathData*>(outPathDataPtr); + *outPathData = *fromPathData; +} + +static void setSkPathFromPathData(JNIEnv*, jobject, jlong outPathPtr, jlong pathDataPtr) { + PathData* pathData = reinterpret_cast<PathData*>(pathDataPtr); + SkPath* skPath = reinterpret_cast<SkPath*>(outPathPtr); + VectorDrawableUtils::verbsToPath(skPath, *pathData); +} + +static const JNINativeMethod gMethods[] = { + {"nParseStringForPath", "(JLjava/lang/String;I)V", (void*)parseStringForPath}, + {"nCreatePathDataFromString", "(Ljava/lang/String;I)J", (void*)createPathDataFromStringPath}, + + // ---------------- @FastNative ----------------- + + {"nCreateEmptyPathData", "()J", (void*)createEmptyPathData}, + {"nCreatePathData", "(J)J", (void*)createPathData}, + {"nInterpolatePathData", "(JJJF)Z", (void*)interpolatePathData}, + {"nFinalize", "(J)V", (void*)deletePathData}, + {"nCanMorph", "(JJ)Z", (void*)canMorphPathData}, + {"nSetPathData", "(JJ)V", (void*)setPathData}, + {"nCreatePathFromPathData", "(JJ)V", (void*)setSkPathFromPathData}, +}; + +int register_android_util_PathParser(JNIEnv* env) { + return RegisterMethodsOrDie(env, "android/util/PathParser", gMethods, NELEM(gMethods)); +} +}; |