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