/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdlib.h>

#include "filters.h"

void estmateWhite(unsigned char *src, int len, int *wr, int *wb, int *wg) {

    int STEP = 4;
    int RANGE = 256;
    int *histR = (int *) malloc(256*sizeof(int));
    int *histG = (int *) malloc(256*sizeof(int));
    int *histB = (int *) malloc(256*sizeof(int));
    int i;
    for (i = 0; i < 255; i++) {
        histR[i] = histG[i] = histB[i] = 0;
    }

    for (i = 0; i < len; i+=STEP) {
        histR[(src[RED])]++;
        histG[(src[GREEN])]++;
        histB[(src[BLUE])]++;
    }
    int min_r = -1, min_g = -1, min_b = -1;
    int sum_r = 0, sum_g = 0, sum_b = 0;

    for (i = 1; i < RANGE-1; i++) {
        int r = histR[i];
        int g = histG[i];
        int b = histB[i];
        sum_r += r;
        sum_g += g;
        sum_b += b;

        if (r > 0 && min_r < 0) {
            min_r = i;
        }
        if (g > 0 && min_g < 0) {
            min_g = i;
        }
        if (b > 0 && min_b < 0) {
            min_b = i;
        }
    }

    int sum15r = 0, sum15g = 0, sum15b = 0;
    int count15r = 0, count15g=0, count15b = 0;
    int tmp_r = 0, tmp_g = 0, tmp_b = 0;

    for (i = RANGE-2; i > 0; i--) {
        int r = histR[i];
        int g = histG[i];
        int b = histB[i];
        tmp_r += r;
        tmp_g += g;
        tmp_b += b;

        if ((tmp_r > sum_r/20) && (tmp_r < sum_r/5)) {
            sum15r += r*i;
            count15r += r;
        }
        if ((tmp_g > sum_g/20) && (tmp_g < sum_g/5)) {
            sum15g += g*i;
            count15g += g;
        }
        if ((tmp_b > sum_b/20) && (tmp_b < sum_b/5)) {
            sum15b += b*i;
            count15b += b;
        }

    }
    free(histR);
    free(histG);
    free(histB);

    if ((count15r > 0) && (count15g > 0) && (count15b > 0)) {
        *wr = sum15r/count15r;
        *wb = sum15g/count15g;
        *wg = sum15b/count15b;
    } else {
        *wg  = *wb = *wr=255;
    }
}

void estmateWhiteBox(unsigned char *src, int iw, int ih, int x,int y, int *wr, int *wb, int *wg) {
    int r = 0;
    int g = 0;
    int b = 0;
    int sum = 0;
    int xp, yp;
    int bounds = 5;
    if (x < 0) x = bounds;
    if (y < 0) y = bounds;
    if (x >= (iw-bounds)) x = (iw-bounds-1);
    if (y >= (ih-bounds)) y = (ih-bounds-1);
    int startx = x - bounds;
    int starty = y - bounds;
    int endx = x + bounds;
    int endy = y + bounds;

    for (yp = starty; yp < endy; yp++) {
        for (xp = startx; xp < endx; xp++) {
            int i = 4*(xp+yp*iw);
            r += src[RED];
            g += src[GREEN];
            b += src[BLUE];
            sum++;
        }
    }
    *wr = r/sum;
    *wg = g/sum;
    *wb = b/sum;
}

void JNIFUNCF(ImageFilterWBalance, nativeApplyFilter, jobject bitmap, jint width, jint height, int locX,int locY)
{
    char* destination = 0;
    AndroidBitmap_lockPixels(env, bitmap, (void**) &destination);
    int i;
    int len = width * height * 4;
    unsigned char * rgb = (unsigned char * )destination;
    int wr;
    int wg;
    int wb;

    if (locX == -1)
        estmateWhite(rgb,len,&wr,&wg,&wb);
    else
        estmateWhiteBox(rgb, width, height,locX,locY,&wr,&wg,&wb);

    int min = MIN(wr, MIN(wg, wb));
    int max = MAX(wr, MAX(wg, wb));
    float avg = (min+max)/2.f;
    float scaleR =  avg/wr;
    float scaleG =  avg/wg;
    float scaleB =  avg/wb;

    for (i = 0; i < len; i += 4)
    {
        int r = rgb[RED];
        int g = rgb[GREEN];
        int b = rgb[BLUE];

        float Rc =  r*scaleR;
        float Gc =  g*scaleG;
        float Bc =  b*scaleB;

        rgb[RED]   = clamp(Rc);
        rgb[GREEN] = clamp(Gc);
        rgb[BLUE]  = clamp(Bc);
    }
    AndroidBitmap_unlockPixels(env, bitmap);
}
