blob: da40acfff3f3d7e89951a4030ea614173f3e9749 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/* 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"
Mike Reed47c0d4e2009-06-22 22:53:52 -040024#include "SkPorterDuff.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025
Romain Guydb1938e2010-08-02 18:50:22 -070026#include <SkiaColorFilter.h>
Chet Haasead93c2b2010-10-22 16:17:12 -070027#include <Caches.h>
Romain Guydb1938e2010-08-02 18:50:22 -070028
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029namespace android {
30
Romain Guydb1938e2010-08-02 18:50:22 -070031using namespace uirenderer;
32
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033class SkColorFilterGlue {
34public:
Ashok Bhat36bef0b2014-01-20 20:08:01 +000035 static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle, jlong fHandle) {
36 SkColorFilter* obj = reinterpret_cast<SkColorFilter *>(objHandle);
37 SkiaColorFilter* f = reinterpret_cast<SkiaColorFilter *>(fHandle);
Romain Guy13656742013-08-19 17:42:51 -070038 if (obj) SkSafeUnref(obj);
Chet Haasead93c2b2010-10-22 16:17:12 -070039 // f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef
40#ifdef USE_OPENGL_RENDERER
Romain Guy13656742013-08-19 17:42:51 -070041 if (f && android::uirenderer::Caches::hasInstance()) {
Chet Haasead93c2b2010-10-22 16:17:12 -070042 android::uirenderer::Caches::getInstance().resourceCache.destructor(f);
43 } else {
44 delete f;
45 }
46#endif
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047 }
48
Ashok Bhat36bef0b2014-01-20 20:08:01 +000049 static jlong glCreatePorterDuffFilter(JNIEnv* env, jobject, jlong skFilterHandle,
50 jint srcColor, jint modeHandle) {
51 SkColorFilter *skFilter = reinterpret_cast<SkColorFilter *>(skFilterHandle);
52 SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle);
Romain Guy16393512010-08-08 00:14:31 -070053#ifdef USE_OPENGL_RENDERER
Ashok Bhat36bef0b2014-01-20 20:08:01 +000054 return reinterpret_cast<jlong>(new SkiaBlendFilter(skFilter, srcColor, SkPorterDuff::ToXfermodeMode(mode)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080055#else
Romain Guy16393512010-08-08 00:14:31 -070056 return NULL;
57#endif
58 }
59
Ashok Bhat36bef0b2014-01-20 20:08:01 +000060 static jlong glCreateLightingFilter(JNIEnv* env, jobject, jlong skFilterHandle,
Chet Haasead93c2b2010-10-22 16:17:12 -070061 jint mul, jint add) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000062 SkColorFilter *skFilter = reinterpret_cast<SkColorFilter *>(skFilterHandle);
Romain Guy16393512010-08-08 00:14:31 -070063#ifdef USE_OPENGL_RENDERER
Ashok Bhat36bef0b2014-01-20 20:08:01 +000064 return reinterpret_cast<jlong>(new SkiaLightingFilter(skFilter, mul, add));
Romain Guy16393512010-08-08 00:14:31 -070065#else
66 return NULL;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080067#endif
68 }
Romain Guydb1938e2010-08-02 18:50:22 -070069
Ashok Bhat36bef0b2014-01-20 20:08:01 +000070 static jlong glCreateColorMatrixFilter(JNIEnv* env, jobject, jlong skFilterHandle,
Chet Haasead93c2b2010-10-22 16:17:12 -070071 jfloatArray jarray) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +000072 SkColorFilter *skFilter = reinterpret_cast<SkColorFilter *>(skFilterHandle);
Romain Guy16393512010-08-08 00:14:31 -070073#ifdef USE_OPENGL_RENDERER
Romain Guydb1938e2010-08-02 18:50:22 -070074 AutoJavaFloatArray autoArray(env, jarray, 20);
75 const float* src = autoArray.ptr();
76
77 float* colorMatrix = new float[16];
78 memcpy(colorMatrix, src, 4 * sizeof(float));
79 memcpy(&colorMatrix[4], &src[5], 4 * sizeof(float));
80 memcpy(&colorMatrix[8], &src[10], 4 * sizeof(float));
81 memcpy(&colorMatrix[12], &src[15], 4 * sizeof(float));
82
83 float* colorVector = new float[4];
84 colorVector[0] = src[4];
85 colorVector[1] = src[9];
86 colorVector[2] = src[14];
87 colorVector[3] = src[19];
88
Ashok Bhat36bef0b2014-01-20 20:08:01 +000089 return reinterpret_cast<jlong>(new SkiaColorMatrixFilter(skFilter, colorMatrix, colorVector));
Romain Guy16393512010-08-08 00:14:31 -070090#else
91 return NULL;
92#endif
93 }
94
Ashok Bhat36bef0b2014-01-20 20:08:01 +000095 static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
96 jint modeHandle) {
97 SkPorterDuff::Mode mode = (SkPorterDuff::Mode) modeHandle;
98 return reinterpret_cast<jlong>(SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode)));
Romain Guy16393512010-08-08 00:14:31 -070099 }
100
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000101 static jlong CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
102 return reinterpret_cast<jlong>(SkColorFilter::CreateLightingFilter(mul, add));
Romain Guy16393512010-08-08 00:14:31 -0700103 }
104
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000105 static jlong CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
Romain Guy16393512010-08-08 00:14:31 -0700106 AutoJavaFloatArray autoArray(env, jarray, 20);
107 const float* src = autoArray.ptr();
108
109#ifdef SK_SCALAR_IS_FIXED
110 SkFixed array[20];
111 for (int i = 0; i < 20; i++) {
112 array[i] = SkFloatToScalar(src[i]);
113 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000114 return reinterpret_cast<jlong>(new SkColorMatrixFilter(array));
Romain Guy16393512010-08-08 00:14:31 -0700115#else
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000116 return reinterpret_cast<jlong>(new SkColorMatrixFilter(src));
Romain Guy16393512010-08-08 00:14:31 -0700117#endif
Romain Guydb1938e2010-08-02 18:50:22 -0700118 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800119};
120
121static JNINativeMethod colorfilter_methods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000122 {"destroyFilter", "(JJ)V", (void*) SkColorFilterGlue::finalizer}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800123};
124
125static JNINativeMethod porterduff_methods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000126 { "native_CreatePorterDuffFilter", "(II)J", (void*) SkColorFilterGlue::CreatePorterDuffFilter },
127 { "nCreatePorterDuffFilter", "(JII)J", (void*) SkColorFilterGlue::glCreatePorterDuffFilter }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800128};
129
130static JNINativeMethod lighting_methods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000131 { "native_CreateLightingFilter", "(II)J", (void*) SkColorFilterGlue::CreateLightingFilter },
132 { "nCreateLightingFilter", "(JII)J", (void*) SkColorFilterGlue::glCreateLightingFilter },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800133};
134
135static JNINativeMethod colormatrix_methods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000136 { "nativeColorMatrixFilter", "([F)J", (void*) SkColorFilterGlue::CreateColorMatrixFilter },
137 { "nColorMatrixFilter", "(J[F)J", (void*) SkColorFilterGlue::glCreateColorMatrixFilter }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138};
139
140#define REG(env, name, array) \
141 result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
142 SK_ARRAY_COUNT(array)); \
143 if (result < 0) return result
144
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145int register_android_graphics_ColorFilter(JNIEnv* env) {
146 int result;
147
148 REG(env, "android/graphics/ColorFilter", colorfilter_methods);
149 REG(env, "android/graphics/PorterDuffColorFilter", porterduff_methods);
150 REG(env, "android/graphics/LightingColorFilter", lighting_methods);
151 REG(env, "android/graphics/ColorMatrixColorFilter", colormatrix_methods);
152
153 return 0;
154}
155
156}