ColorFilter.cpp revision 76d3a1b8d035d27bc80b0f2fc480a903bd001514
1/* libs/android_runtime/android/graphics/ColorFilter.cpp 2** 3** Copyright 2006, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#include "jni.h" 19#include "GraphicsJNI.h" 20#include <android_runtime/AndroidRuntime.h> 21 22#include "SkColorFilter.h" 23#include "SkColorMatrixFilter.h" 24#include "SkPorterDuff.h" 25 26#include <Caches.h> 27 28namespace android { 29 30using namespace uirenderer; 31 32class SkColorFilterGlue { 33public: 34 static void finalizer(JNIEnv* env, jobject clazz, jlong skFilterHandle) { 35 SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(skFilterHandle); 36 if (filter) SkSafeUnref(filter); 37 } 38 39 static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, 40 jint modeHandle) { 41 SkPorterDuff::Mode mode = (SkPorterDuff::Mode) modeHandle; 42 return reinterpret_cast<jlong>(SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode))); 43 } 44 45 static jlong CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) { 46 return reinterpret_cast<jlong>(SkColorFilter::CreateLightingFilter(mul, add)); 47 } 48 49 static jlong CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) { 50 AutoJavaFloatArray autoArray(env, jarray, 20); 51 const float* src = autoArray.ptr(); 52 53#ifdef SK_SCALAR_IS_FIXED 54 SkFixed array[20]; 55 for (int i = 0; i < 20; i++) { 56 array[i] = SkFloatToScalar(src[i]); 57 } 58 return reinterpret_cast<jlong>(new SkColorMatrixFilter(array)); 59#else 60 return reinterpret_cast<jlong>(new SkColorMatrixFilter(src)); 61#endif 62 } 63}; 64 65static JNINativeMethod colorfilter_methods[] = { 66 {"destroyFilter", "(J)V", (void*) SkColorFilterGlue::finalizer} 67}; 68 69static JNINativeMethod porterduff_methods[] = { 70 { "native_CreatePorterDuffFilter", "(II)J", (void*) SkColorFilterGlue::CreatePorterDuffFilter }, 71}; 72 73static JNINativeMethod lighting_methods[] = { 74 { "native_CreateLightingFilter", "(II)J", (void*) SkColorFilterGlue::CreateLightingFilter }, 75}; 76 77static JNINativeMethod colormatrix_methods[] = { 78 { "nativeColorMatrixFilter", "([F)J", (void*) SkColorFilterGlue::CreateColorMatrixFilter }, 79}; 80 81#define REG(env, name, array) \ 82 result = android::AndroidRuntime::registerNativeMethods(env, name, array, \ 83 SK_ARRAY_COUNT(array)); \ 84 if (result < 0) return result 85 86int register_android_graphics_ColorFilter(JNIEnv* env) { 87 int result; 88 89 REG(env, "android/graphics/ColorFilter", colorfilter_methods); 90 REG(env, "android/graphics/PorterDuffColorFilter", porterduff_methods); 91 REG(env, "android/graphics/LightingColorFilter", lighting_methods); 92 REG(env, "android/graphics/ColorMatrixColorFilter", colormatrix_methods); 93 94 return 0; 95} 96 97} 98