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