10d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard/* 20d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * Copyright (C) 2012 The Android Open Source Project 30d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * 40d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 50d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * you may not use this file except in compliance with the License. 60d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * You may obtain a copy of the License at 70d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * 80d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 90d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * 100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * Unless required by applicable law or agreed to in writing, software 110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * See the License for the specific language governing permissions and 140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard * limitations under the License. 150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard */ 160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard#include "filters.h" 180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardvoid JNIFUNCF(ImageFilter, nativeApplyGradientFilter, jobject bitmap, jint width, jint height, 200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard jintArray redGradient, jintArray greenGradient, jintArray blueGradient) 210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard{ 220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard char* destination = 0; 230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard jint* redGradientArray = 0; 240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard jint* greenGradientArray = 0; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard jint* blueGradientArray = 0; 260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (redGradient) 270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard redGradientArray = (*env)->GetIntArrayElements(env, redGradient, NULL); 280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (greenGradient) 290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard greenGradientArray = (*env)->GetIntArrayElements(env, greenGradient, NULL); 300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (blueGradient) 310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard blueGradientArray = (*env)->GetIntArrayElements(env, blueGradient, NULL); 320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard AndroidBitmap_lockPixels(env, bitmap, (void**) &destination); 340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int i; 350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int len = width * height * 4; 360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (i = 0; i < len; i+=4) 370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard { 380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (redGradient) 390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard { 400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int r = destination[RED]; 410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard r = redGradientArray[r]; 420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard destination[RED] = r; 430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (greenGradient) 450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard { 460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int g = destination[GREEN]; 470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard g = greenGradientArray[g]; 480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard destination[GREEN] = g; 490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (blueGradient) 510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard { 520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int b = destination[BLUE]; 530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard b = blueGradientArray[b]; 540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard destination[BLUE] = b; 550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (redGradient) 580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard (*env)->ReleaseIntArrayElements(env, redGradient, redGradientArray, 0); 590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (greenGradient) 600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard (*env)->ReleaseIntArrayElements(env, greenGradient, greenGradientArray, 0); 610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (blueGradient) 620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard (*env)->ReleaseIntArrayElements(env, blueGradient, blueGradientArray, 0); 630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard AndroidBitmap_unlockPixels(env, bitmap); 640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 66