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