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// This file was generated from the C++ include file: SkColorFilter.h
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Any changes made to this file will be discarded by the build.
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// To change this file, either edit the include, or device/tools/gluemaker/main.cpp,
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// or one of the auxilary file specifications in device/tools/gluemaker.
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkDrawFilter.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPaintFlagsDrawFilter.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPaint.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
335f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III// Custom version of SkPaintFlagsDrawFilter that also calls setFilterLevel.
345f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins IIIclass CompatFlagsDrawFilter : public SkPaintFlagsDrawFilter {
355f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins IIIpublic:
365f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    CompatFlagsDrawFilter(uint32_t clearFlags, uint32_t setFlags,
375f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            SkPaint::FilterLevel desiredLevel)
385f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    : SkPaintFlagsDrawFilter(clearFlags, setFlags)
395f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    , fDesiredLevel(desiredLevel) {
405f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    }
415f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
425f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    virtual bool filter(SkPaint* paint, Type type) {
435f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III        SkPaintFlagsDrawFilter::filter(paint, type);
445f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III        paint->setFilterLevel(fDesiredLevel);
455f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III        return true;
465f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    }
475f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
485f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins IIIprivate:
495f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    const SkPaint::FilterLevel fDesiredLevel;
505f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III};
515f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
525f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III// Returns whether flags contains FILTER_BITMAP_FLAG. If flags does, remove it.
535f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins IIIstatic inline bool hadFiltering(jint& flags) {
545f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    // Equivalent to the Java Paint's FILTER_BITMAP_FLAG.
555f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    static const uint32_t sFilterBitmapFlag = 0x02;
565f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
575f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    const bool result = (flags & sFilterBitmapFlag) != 0;
585f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    flags &= ~sFilterBitmapFlag;
595f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III    return result;
605f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III}
615f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkDrawFilterGlue {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) {
6636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkDrawFilter* obj = reinterpret_cast<SkDrawFilter*>(objHandle);
676062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger        SkSafeUnref(obj);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong CreatePaintFlagsDF(JNIEnv* env, jobject clazz,
7136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                    jint clearFlags, jint setFlags) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clearFlags | setFlags) {
735f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            // Mask both groups of flags to remove FILTER_BITMAP_FLAG, which no
745f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            // longer has a Skia equivalent flag (instead it corresponds to
755f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            // calling setFilterLevel), and keep track of which group(s), if
765f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            // any, had the flag set.
775f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            const bool turnFilteringOn = hadFiltering(setFlags);
785f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            const bool turnFilteringOff = hadFiltering(clearFlags);
795f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III
805f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            SkDrawFilter* filter;
815f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            if (turnFilteringOn) {
825f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                // Turning filtering on overrides turning it off.
835f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                filter = new CompatFlagsDrawFilter(clearFlags, setFlags,
845f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                        SkPaint::kLow_FilterLevel);
855f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            } else if (turnFilteringOff) {
865f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                filter = new CompatFlagsDrawFilter(clearFlags, setFlags,
875f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                        SkPaint::kNone_FilterLevel);
885f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            } else {
895f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III                filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags);
905f6aa983d620eb123cd11943235daa68f725ef46Leon Scroggins III            }
9136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            return reinterpret_cast<jlong>(filter);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod drawfilter_methods[] = {
9936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"nativeDestructor", "(J)V", (void*) SkDrawFilterGlue::finalizer}
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod paintflags_methods[] = {
10336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"nativeConstructor","(II)J", (void*) SkDrawFilterGlue::CreatePaintFlagsDF}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array)                                                                       \
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = android::AndroidRuntime::registerNativeMethods(env, name, array, SK_ARRAY_COUNT(array));  \
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result < 0) return result
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_DrawFilter(JNIEnv* env) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/DrawFilter", drawfilter_methods);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/PaintFlagsDrawFilter", paintflags_methods);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
121