19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/android_runtime/android/graphics/ColorFilter.cpp 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkColorFilter.h" 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkColorMatrixFilter.h" 2447c0d4eaa926d979c5ea366934750526c20af8ffMike Reed#include "SkPorterDuff.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase#include <Caches.h> 27db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyusing namespace uirenderer; 31db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkColorFilterGlue { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3476d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger static void finalizer(JNIEnv* env, jobject clazz, jlong skFilterHandle) { 3576d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(skFilterHandle); 3676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger if (filter) SkSafeUnref(filter); 37163935113919a184122b8b3bd672ef08c8df65dcRomain Guy } 38163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 3936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, 4036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat jint modeHandle) { 4136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat SkPorterDuff::Mode mode = (SkPorterDuff::Mode) modeHandle; 4236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode))); 43163935113919a184122b8b3bd672ef08c8df65dcRomain Guy } 44163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 4536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) { 4636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return reinterpret_cast<jlong>(SkColorFilter::CreateLightingFilter(mul, add)); 47163935113919a184122b8b3bd672ef08c8df65dcRomain Guy } 48163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 4936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat static jlong CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) { 50163935113919a184122b8b3bd672ef08c8df65dcRomain Guy AutoJavaFloatArray autoArray(env, jarray, 20); 51163935113919a184122b8b3bd672ef08c8df65dcRomain Guy const float* src = autoArray.ptr(); 52163935113919a184122b8b3bd672ef08c8df65dcRomain Guy 5346cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins#ifdef SK_SCALAR_IS_FLOAT 54cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins return reinterpret_cast<jlong>(SkColorMatrixFilter::Create(src)); 5546cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins#else 5646cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins SkASSERT(false); 57163935113919a184122b8b3bd672ef08c8df65dcRomain Guy#endif 58db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod colorfilter_methods[] = { 6276d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger {"destroyFilter", "(J)V", (void*) SkColorFilterGlue::finalizer} 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod porterduff_methods[] = { 6636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "native_CreatePorterDuffFilter", "(II)J", (void*) SkColorFilterGlue::CreatePorterDuffFilter }, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod lighting_methods[] = { 7036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "native_CreateLightingFilter", "(II)J", (void*) SkColorFilterGlue::CreateLightingFilter }, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod colormatrix_methods[] = { 7436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat { "nativeColorMatrixFilter", "([F)J", (void*) SkColorFilterGlue::CreateColorMatrixFilter }, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array) \ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = android::AndroidRuntime::registerNativeMethods(env, name, array, \ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SK_ARRAY_COUNT(array)); \ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result < 0) return result 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_ColorFilter(JNIEnv* env) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/ColorFilter", colorfilter_methods); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/PorterDuffColorFilter", porterduff_methods); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/LightingColorFilter", lighting_methods); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REG(env, "android/graphics/ColorMatrixColorFilter", colormatrix_methods); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 94