ColorFilter.cpp revision db1938e0e6ef816e228c815adccebd5cb05f2aa8
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 <SkiaColorFilter.h> 27 28namespace android { 29 30using namespace uirenderer; 31 32class SkColorFilterGlue { 33public: 34 static void finalizer(JNIEnv* env, jobject clazz, SkColorFilter* obj, SkiaColorFilter* f) { 35 delete f; 36 obj->safeUnref(); 37 } 38 39 static SkColorFilter* CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, 40 SkPorterDuff::Mode mode) { 41 return SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode)); 42 } 43 44 static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, 45 SkPorterDuff::Mode mode) { 46 return new SkiaBlendFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode)); 47 } 48 49 static SkColorFilter* CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) { 50 return SkColorFilter::CreateLightingFilter(mul, add); 51 } 52 53 static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) { 54 return new SkiaLightingFilter(mul, add); 55 } 56 57 static SkColorFilter* CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) { 58 AutoJavaFloatArray autoArray(env, jarray, 20); 59 const float* src = autoArray.ptr(); 60 61#ifdef SK_SCALAR_IS_FIXED 62 SkFixed array[20]; 63 for (int i = 0; i < 20; i++) { 64 array[i] = SkFloatToScalar(src[i]); 65 } 66 return new SkColorMatrixFilter(array); 67#else 68 return new SkColorMatrixFilter(src); 69#endif 70 } 71 72 static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) { 73 AutoJavaFloatArray autoArray(env, jarray, 20); 74 const float* src = autoArray.ptr(); 75 76 float* colorMatrix = new float[16]; 77 memcpy(colorMatrix, src, 4 * sizeof(float)); 78 memcpy(&colorMatrix[4], &src[5], 4 * sizeof(float)); 79 memcpy(&colorMatrix[8], &src[10], 4 * sizeof(float)); 80 memcpy(&colorMatrix[12], &src[15], 4 * sizeof(float)); 81 82 float* colorVector = new float[4]; 83 colorVector[0] = src[4]; 84 colorVector[1] = src[9]; 85 colorVector[2] = src[14]; 86 colorVector[3] = src[19]; 87 88 return new SkiaColorMatrixFilter(colorMatrix, colorVector); 89 } 90}; 91 92static JNINativeMethod colorfilter_methods[] = { 93 {"finalizer", "(II)V", (void*) SkColorFilterGlue::finalizer} 94}; 95 96static JNINativeMethod porterduff_methods[] = { 97 { "native_CreatePorterDuffFilter", "(II)I", (void*) SkColorFilterGlue::CreatePorterDuffFilter }, 98 { "nCreatePorterDuffFilter", "(II)I", (void*) SkColorFilterGlue::glCreatePorterDuffFilter } 99}; 100 101static JNINativeMethod lighting_methods[] = { 102 { "native_CreateLightingFilter", "(II)I", (void*) SkColorFilterGlue::CreateLightingFilter }, 103 { "nCreateLightingFilter", "(II)I", (void*) SkColorFilterGlue::glCreateLightingFilter }, 104}; 105 106static JNINativeMethod colormatrix_methods[] = { 107 { "nativeColorMatrixFilter", "([F)I", (void*) SkColorFilterGlue::CreateColorMatrixFilter }, 108 { "nColorMatrixFilter", "([F)I", (void*) SkColorFilterGlue::glCreateColorMatrixFilter } 109}; 110 111#define REG(env, name, array) \ 112 result = android::AndroidRuntime::registerNativeMethods(env, name, array, \ 113 SK_ARRAY_COUNT(array)); \ 114 if (result < 0) return result 115 116int register_android_graphics_ColorFilter(JNIEnv* env) { 117 int result; 118 119 REG(env, "android/graphics/ColorFilter", colorfilter_methods); 120 REG(env, "android/graphics/PorterDuffColorFilter", porterduff_methods); 121 REG(env, "android/graphics/LightingColorFilter", lighting_methods); 122 REG(env, "android/graphics/ColorMatrixColorFilter", colormatrix_methods); 123 124 return 0; 125} 126 127} 128