/* libs/android_runtime/android/graphics/PathMeasure.cpp ** ** Copyright 2007, 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 #include "GraphicsJNI.h" #include "SkPath.h" #include "SkPoint.h" namespace android { class SkPathIteratorGlue { public: static void finalizer(SkPath::RawIter* obj) { delete obj; } static jlong getFinalizer(JNIEnv* env, jclass clazz) { return static_cast(reinterpret_cast(&finalizer)); } static jlong create(JNIEnv* env, jobject clazz, jlong pathHandle) { const SkPath* path = reinterpret_cast(pathHandle); return reinterpret_cast(new SkPath::RawIter(*path)); } // ---------------- @CriticalNative ------------------------- static jint peek(CRITICAL_JNI_PARAMS_COMMA jlong iteratorHandle) { SkPath::RawIter* iterator = reinterpret_cast(iteratorHandle); return iterator->peek(); } static jint next(CRITICAL_JNI_PARAMS_COMMA jlong iteratorHandle, jlong pointsArray) { static_assert(SkPath::kMove_Verb == 0, "SkPath::Verb unexpected index"); static_assert(SkPath::kLine_Verb == 1, "SkPath::Verb unexpected index"); static_assert(SkPath::kQuad_Verb == 2, "SkPath::Verb unexpected index"); static_assert(SkPath::kConic_Verb == 3, "SkPath::Verb unexpected index"); static_assert(SkPath::kCubic_Verb == 4, "SkPath::Verb unexpected index"); static_assert(SkPath::kClose_Verb == 5, "SkPath::Verb unexpected index"); static_assert(SkPath::kDone_Verb == 6, "SkPath::Verb unexpected index"); SkPath::RawIter* iterator = reinterpret_cast(iteratorHandle); float* points = reinterpret_cast(pointsArray); SkPath::Verb verb = static_cast(iterator->next(reinterpret_cast(points))); if (verb == SkPath::kConic_Verb) { float weight = iterator->conicWeight(); points[6] = weight; } return static_cast(verb); } }; static const JNINativeMethod methods[] = { {"nCreate", "(J)J", (void*)SkPathIteratorGlue::create}, {"nGetFinalizer", "()J", (void*)SkPathIteratorGlue::getFinalizer}, // ------- @CriticalNative below here ------------------ {"nPeek", "(J)I", (void*)SkPathIteratorGlue::peek}, {"nNext", "(JJ)I", (void*)SkPathIteratorGlue::next}, }; int register_android_graphics_PathIterator(JNIEnv* env) { return RegisterMethodsOrDie(env, "android/graphics/PathIterator", methods, NELEM(methods)); } } // namespace android