blob: 0b95148d3c82705f2e3f89b2536e08d4acee4c3b [file] [log] [blame]
/* libs/android_runtime/android/graphics/ColorFilter.cpp
**
** Copyright 2006, 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 "ColorFilter.h"
#include "GraphicsJNI.h"
#include "SkBlendMode.h"
namespace android {
using namespace uirenderer;
class ColorFilterGlue {
public:
static void SafeUnref(ColorFilter* filter) {
if (filter) {
filter->decStrong(nullptr);
}
}
static jlong GetNativeFinalizer(JNIEnv*, jobject) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&SafeUnref));
}
static jlong CreateBlendModeFilter(JNIEnv* env, jobject, jint srcColor, jint modeHandle) {
auto mode = static_cast<SkBlendMode>(modeHandle);
auto* blendModeFilter = new BlendModeColorFilter(srcColor, mode);
blendModeFilter->incStrong(nullptr);
return static_cast<jlong>(reinterpret_cast<uintptr_t>(blendModeFilter));
}
static jlong CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
auto* lightingFilter = new LightingFilter(mul, add);
lightingFilter->incStrong(nullptr);
return static_cast<jlong>(reinterpret_cast<uintptr_t>(lightingFilter));
}
static void SetLightingFilterMul(JNIEnv* env, jobject, jlong lightingFilterPtr, jint mul) {
auto* filter = reinterpret_cast<LightingFilter*>(lightingFilterPtr);
if (filter) {
filter->setMul(mul);
}
}
static void SetLightingFilterAdd(JNIEnv* env, jobject, jlong lightingFilterPtr, jint add) {
auto* filter = reinterpret_cast<LightingFilter*>(lightingFilterPtr);
if (filter) {
filter->setAdd(add);
}
}
static std::vector<float> getMatrixFromJFloatArray(JNIEnv* env, jfloatArray jarray) {
std::vector<float> matrix(20);
// float matrix[20];
env->GetFloatArrayRegion(jarray, 0, 20, matrix.data());
// java biases the translates by 255, so undo that before calling skia
matrix[ 4] *= (1.0f/255);
matrix[ 9] *= (1.0f/255);
matrix[14] *= (1.0f/255);
matrix[19] *= (1.0f/255);
return matrix;
}
static jlong CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
std::vector<float> matrix = getMatrixFromJFloatArray(env, jarray);
auto* colorMatrixColorFilter = new ColorMatrixColorFilter(std::move(matrix));
colorMatrixColorFilter->incStrong(nullptr);
return static_cast<jlong>(reinterpret_cast<uintptr_t>(colorMatrixColorFilter));
}
static void SetColorMatrix(JNIEnv* env, jobject, jlong colorMatrixColorFilterPtr,
jfloatArray jarray) {
auto* filter = reinterpret_cast<ColorMatrixColorFilter*>(colorMatrixColorFilterPtr);
if (filter) {
filter->setMatrix(getMatrixFromJFloatArray(env, jarray));
}
}
};
static const JNINativeMethod colorfilter_methods[] = {
{"nativeGetFinalizer", "()J", (void*)ColorFilterGlue::GetNativeFinalizer}};
static const JNINativeMethod blendmode_methods[] = {
{"native_CreateBlendModeFilter", "(II)J", (void*)ColorFilterGlue::CreateBlendModeFilter},
};
static const JNINativeMethod lighting_methods[] = {
{"native_CreateLightingFilter", "(II)J", (void*)ColorFilterGlue::CreateLightingFilter},
{"native_SetLightingFilterAdd", "(JI)V", (void*)ColorFilterGlue::SetLightingFilterAdd},
{"native_SetLightingFilterMul", "(JI)V", (void*)ColorFilterGlue::SetLightingFilterMul}};
static const JNINativeMethod colormatrix_methods[] = {
{"nativeColorMatrixFilter", "([F)J", (void*)ColorFilterGlue::CreateColorMatrixFilter},
{"nativeSetColorMatrix", "(J[F)V", (void*)ColorFilterGlue::SetColorMatrix}};
int register_android_graphics_ColorFilter(JNIEnv* env) {
android::RegisterMethodsOrDie(env, "android/graphics/ColorFilter", colorfilter_methods,
NELEM(colorfilter_methods));
android::RegisterMethodsOrDie(env, "android/graphics/PorterDuffColorFilter", blendmode_methods,
NELEM(blendmode_methods));
android::RegisterMethodsOrDie(env, "android/graphics/BlendModeColorFilter", blendmode_methods,
NELEM(blendmode_methods));
android::RegisterMethodsOrDie(env, "android/graphics/LightingColorFilter", lighting_methods,
NELEM(lighting_methods));
android::RegisterMethodsOrDie(env, "android/graphics/ColorMatrixColorFilter",
colormatrix_methods, NELEM(colormatrix_methods));
return 0;
}
}