blob: dd1177b9075008febf2e636728740813373e7197 [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:
Romain Guydb1938e2010-08-02 18:50:22 -070035 static void finalizer(JNIEnv* env, jobject clazz, SkColorFilter* obj, SkiaColorFilter* f) {
Derek Sollenberger6062c592011-02-22 13:55:04 -050036 SkSafeUnref(obj);
Chet Haasead93c2b2010-10-22 16:17:12 -070037 // f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef
38#ifdef USE_OPENGL_RENDERER
39 if (android::uirenderer::Caches::hasInstance()) {
40 android::uirenderer::Caches::getInstance().resourceCache.destructor(f);
41 } else {
42 delete f;
43 }
44#endif
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 }
46
Chet Haasead93c2b2010-10-22 16:17:12 -070047 static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
48 jint srcColor, SkPorterDuff::Mode mode) {
Romain Guy16393512010-08-08 00:14:31 -070049#ifdef USE_OPENGL_RENDERER
Chet Haasead93c2b2010-10-22 16:17:12 -070050 return new SkiaBlendFilter(skFilter, srcColor, SkPorterDuff::ToXfermodeMode(mode));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051#else
Romain Guy16393512010-08-08 00:14:31 -070052 return NULL;
53#endif
54 }
55
Chet Haasead93c2b2010-10-22 16:17:12 -070056 static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
57 jint mul, jint add) {
Romain Guy16393512010-08-08 00:14:31 -070058#ifdef USE_OPENGL_RENDERER
Chet Haasead93c2b2010-10-22 16:17:12 -070059 return new SkiaLightingFilter(skFilter, mul, add);
Romain Guy16393512010-08-08 00:14:31 -070060#else
61 return NULL;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080062#endif
63 }
Romain Guydb1938e2010-08-02 18:50:22 -070064
Chet Haasead93c2b2010-10-22 16:17:12 -070065 static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
66 jfloatArray jarray) {
Romain Guy16393512010-08-08 00:14:31 -070067#ifdef USE_OPENGL_RENDERER
Romain Guydb1938e2010-08-02 18:50:22 -070068 AutoJavaFloatArray autoArray(env, jarray, 20);
69 const float* src = autoArray.ptr();
70
71 float* colorMatrix = new float[16];
72 memcpy(colorMatrix, src, 4 * sizeof(float));
73 memcpy(&colorMatrix[4], &src[5], 4 * sizeof(float));
74 memcpy(&colorMatrix[8], &src[10], 4 * sizeof(float));
75 memcpy(&colorMatrix[12], &src[15], 4 * sizeof(float));
76
77 float* colorVector = new float[4];
78 colorVector[0] = src[4];
79 colorVector[1] = src[9];
80 colorVector[2] = src[14];
81 colorVector[3] = src[19];
82
Chet Haasead93c2b2010-10-22 16:17:12 -070083 return new SkiaColorMatrixFilter(skFilter, colorMatrix, colorVector);
Romain Guy16393512010-08-08 00:14:31 -070084#else
85 return NULL;
86#endif
87 }
88
89 static SkColorFilter* CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
90 SkPorterDuff::Mode mode) {
91 return SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode));
92 }
93
94 static SkColorFilter* CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
95 return SkColorFilter::CreateLightingFilter(mul, add);
96 }
97
98 static SkColorFilter* CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
99 AutoJavaFloatArray autoArray(env, jarray, 20);
100 const float* src = autoArray.ptr();
101
102#ifdef SK_SCALAR_IS_FIXED
103 SkFixed array[20];
104 for (int i = 0; i < 20; i++) {
105 array[i] = SkFloatToScalar(src[i]);
106 }
107 return new SkColorMatrixFilter(array);
108#else
109 return new SkColorMatrixFilter(src);
110#endif
Romain Guydb1938e2010-08-02 18:50:22 -0700111 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800112};
113
114static JNINativeMethod colorfilter_methods[] = {
Romain Guydb1938e2010-08-02 18:50:22 -0700115 {"finalizer", "(II)V", (void*) SkColorFilterGlue::finalizer}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116};
117
118static JNINativeMethod porterduff_methods[] = {
Romain Guydb1938e2010-08-02 18:50:22 -0700119 { "native_CreatePorterDuffFilter", "(II)I", (void*) SkColorFilterGlue::CreatePorterDuffFilter },
Chet Haasead93c2b2010-10-22 16:17:12 -0700120 { "nCreatePorterDuffFilter", "(III)I", (void*) SkColorFilterGlue::glCreatePorterDuffFilter }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800121};
122
123static JNINativeMethod lighting_methods[] = {
Romain Guydb1938e2010-08-02 18:50:22 -0700124 { "native_CreateLightingFilter", "(II)I", (void*) SkColorFilterGlue::CreateLightingFilter },
Chet Haasead93c2b2010-10-22 16:17:12 -0700125 { "nCreateLightingFilter", "(III)I", (void*) SkColorFilterGlue::glCreateLightingFilter },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800126};
127
128static JNINativeMethod colormatrix_methods[] = {
Romain Guydb1938e2010-08-02 18:50:22 -0700129 { "nativeColorMatrixFilter", "([F)I", (void*) SkColorFilterGlue::CreateColorMatrixFilter },
Chet Haasead93c2b2010-10-22 16:17:12 -0700130 { "nColorMatrixFilter", "(I[F)I", (void*) SkColorFilterGlue::glCreateColorMatrixFilter }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131};
132
133#define REG(env, name, array) \
134 result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
135 SK_ARRAY_COUNT(array)); \
136 if (result < 0) return result
137
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138int register_android_graphics_ColorFilter(JNIEnv* env) {
139 int result;
140
141 REG(env, "android/graphics/ColorFilter", colorfilter_methods);
142 REG(env, "android/graphics/PorterDuffColorFilter", porterduff_methods);
143 REG(env, "android/graphics/LightingColorFilter", lighting_methods);
144 REG(env, "android/graphics/ColorMatrixColorFilter", colormatrix_methods);
145
146 return 0;
147}
148
149}