/* * Copyright 2021 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include "include/core/SkColorFilter.h" #include "include/core/SkPaint.h" #include "include/core/SkShader.h" #include "include/effects/SkImageFilters.h" namespace { static jlong Paint_Create(JNIEnv*, jobject) { return reinterpret_cast(new SkPaint); } static void Paint_Release(JNIEnv*, jobject, jlong native_paint) { delete reinterpret_cast(native_paint); } static void Paint_SetColor(JNIEnv*, jobject, jlong native_paint, float r, float g, float b, float a) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setColor4f({r, g, b, a}); } } static void Paint_SetStroke(JNIEnv*, jobject, jlong native_paint, jboolean stroke) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setStroke(stroke); } } static void Paint_SetStrokeWidth(JNIEnv*, jobject, jlong native_paint, jfloat width) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setStrokeWidth(width); } } static void Paint_SetStrokeCap(JNIEnv* env, jobject, jlong native_paint, jint native_cap) { if (auto* paint = reinterpret_cast(native_paint)) { switch (native_cap) { case 0: paint->setStrokeCap(SkPaint::kButt_Cap); break; case 1: paint->setStrokeCap(SkPaint::kRound_Cap); break; case 2: paint->setStrokeCap(SkPaint::kSquare_Cap); break; default: break; } } } static void Paint_SetStrokeJoin(JNIEnv* env, jobject, jlong native_paint, jint native_join) { if (auto* paint = reinterpret_cast(native_paint)) { switch (native_join) { case 0: paint->setStrokeJoin(SkPaint::kMiter_Join); break; case 1: paint->setStrokeJoin(SkPaint::kRound_Join); break; case 2: paint->setStrokeJoin(SkPaint::kBevel_Join); break; default: break; } } } static void Paint_SetStrokeMiter(JNIEnv* env, jobject, jlong native_paint, jfloat limit) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setStrokeMiter(limit); } } static void Paint_SetColorFilter(JNIEnv*, jobject, jlong native_paint, jlong native_cf) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setColorFilter(sk_ref_sp(reinterpret_cast(native_cf))); } } static void Paint_SetShader(JNIEnv*, jobject, jlong native_paint, jlong native_shader) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setShader(sk_ref_sp(reinterpret_cast(native_shader))); } } static void Paint_SetImageFilter(JNIEnv*, jobject, jlong native_paint, jlong native_filter) { if (auto* paint = reinterpret_cast(native_paint)) { paint->setImageFilter(sk_ref_sp(reinterpret_cast(native_filter))); } } } // namespace int register_jetski_Paint(JNIEnv* env) { static const JNINativeMethod methods[] = { {"nCreate" , "()J" , reinterpret_cast(Paint_Create)}, {"nRelease" , "(J)V" , reinterpret_cast(Paint_Release)}, {"nSetColor" , "(JFFFF)V", reinterpret_cast(Paint_SetColor)}, {"nSetStroke" , "(JZ)V" , reinterpret_cast(Paint_SetStroke)}, {"nSetStrokeWidth" , "(JF)V" , reinterpret_cast(Paint_SetStrokeWidth)}, {"nSetStrokeCap" , "(JI)V" , reinterpret_cast(Paint_SetStrokeCap)}, {"nSetStrokeJoin" , "(JI)V" , reinterpret_cast(Paint_SetStrokeJoin)}, {"nSetStrokeMiter" , "(JF)V" , reinterpret_cast(Paint_SetStrokeMiter)}, {"nSetColorFilter" , "(JJ)V" , reinterpret_cast(Paint_SetColorFilter)}, {"nSetShader" , "(JJ)V" , reinterpret_cast(Paint_SetShader)}, {"nSetImageFilter" , "(JJ)V" , reinterpret_cast(Paint_SetImageFilter)}, }; const auto clazz = env->FindClass("org/skia/jetski/Paint"); return clazz ? env->RegisterNatives(clazz, methods, std::size(methods)) : JNI_ERR; }