blob: c1c8964bf5eb67ce7fa30e0a33d3c8a387ae5858 [file] [log] [blame]
/*
* Copyright (C) 2024 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 "RuntimeEffectUtils.h"
#include "SkBlender.h"
using namespace android::uirenderer;
static void SkRuntimeEffectBuilder_delete(SkRuntimeEffectBuilder* builder) {
delete builder;
}
static jlong RuntimeXfermode_getNativeFinalizer(JNIEnv*, jobject) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&SkRuntimeEffectBuilder_delete));
}
static jlong RuntimeXfermode_createBuilder(JNIEnv* env, jobject, jstring sksl) {
ScopedUtfChars strSksl(env, sksl);
auto result =
SkRuntimeEffect::MakeForBlender(SkString(strSksl.c_str()), SkRuntimeEffect::Options{});
if (result.effect.get() == nullptr) {
doThrowIAE(env, result.errorText.c_str());
return 0;
}
return reinterpret_cast<jlong>(new SkRuntimeEffectBuilder(std::move(result.effect)));
}
static jlong RuntimeXfermode_create(JNIEnv* env, jobject, jlong builderPtr) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
sk_sp<SkBlender> blender = builder->makeBlender();
if (!blender) {
doThrowIAE(env);
}
return reinterpret_cast<jlong>(blender.release());
}
static void RuntimeXfermode_updateFloatArrayUniforms(JNIEnv* env, jobject, jlong builderPtr,
jstring uniformName, jfloatArray uniforms,
jboolean isColor) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
ScopedUtfChars name(env, uniformName);
AutoJavaFloatArray autoValues(env, uniforms, 0, kRO_JNIAccess);
UpdateFloatUniforms(env, builder, name.c_str(), autoValues.ptr(), autoValues.length(), isColor);
}
static void RuntimeXfermode_updateFloatUniforms(JNIEnv* env, jobject, jlong builderPtr,
jstring uniformName, jfloat value1, jfloat value2,
jfloat value3, jfloat value4, jint count) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
ScopedUtfChars name(env, uniformName);
const float values[4] = {value1, value2, value3, value4};
UpdateFloatUniforms(env, builder, name.c_str(), values, count, false);
}
static void RuntimeXfermode_updateIntArrayUniforms(JNIEnv* env, jobject, jlong builderPtr,
jstring uniformName, jintArray uniforms) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
ScopedUtfChars name(env, uniformName);
AutoJavaIntArray autoValues(env, uniforms, 0);
UpdateIntUniforms(env, builder, name.c_str(), autoValues.ptr(), autoValues.length());
}
static void RuntimeXfermode_updateIntUniforms(JNIEnv* env, jobject, jlong builderPtr,
jstring uniformName, jint value1, jint value2,
jint value3, jint value4, jint count) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
ScopedUtfChars name(env, uniformName);
const int values[4] = {value1, value2, value3, value4};
UpdateIntUniforms(env, builder, name.c_str(), values, count);
}
static void RuntimeXfermode_updateChild(JNIEnv* env, jobject, jlong builderPtr, jstring childName,
jlong childPtr) {
auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr);
ScopedUtfChars name(env, childName);
auto* child = reinterpret_cast<SkFlattenable*>(childPtr);
if (child) {
UpdateChild(env, builder, name.c_str(), child);
}
}
static const JNINativeMethod gRuntimeXfermodeMethods[] = {
{"nativeGetFinalizer", "()J", (void*)RuntimeXfermode_getNativeFinalizer},
{"nativeCreateBlenderBuilder", "(Ljava/lang/String;)J",
(void*)RuntimeXfermode_createBuilder},
{"nativeCreateNativeInstance", "(J)J", (void*)RuntimeXfermode_create},
{"nativeUpdateUniforms", "(JLjava/lang/String;[FZ)V",
(void*)RuntimeXfermode_updateFloatArrayUniforms},
{"nativeUpdateUniforms", "(JLjava/lang/String;FFFFI)V",
(void*)RuntimeXfermode_updateFloatUniforms},
{"nativeUpdateUniforms", "(JLjava/lang/String;[I)V",
(void*)RuntimeXfermode_updateIntArrayUniforms},
{"nativeUpdateUniforms", "(JLjava/lang/String;IIIII)V",
(void*)RuntimeXfermode_updateIntUniforms},
{"nativeUpdateChild", "(JLjava/lang/String;J)V", (void*)RuntimeXfermode_updateChild},
};
int register_android_graphics_RuntimeXfermode(JNIEnv* env) {
android::RegisterMethodsOrDie(env, "android/graphics/RuntimeXfermode", gRuntimeXfermodeMethods,
NELEM(gRuntimeXfermodeMethods));
return 0;
}