/*
* Copyright (C) 2011-2014 MediaTek Inc.
* 
* This program is free software: you can redistribute it and/or modify it under the terms of the 
* GNU General Public License version 2 as published by the Free Software Foundation.
* 
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>.
*/

#include "tpd.h"
//#ifdef TPD_HAVE_CALIBRATION

//#ifndef TPD_CUSTOM_CALIBRATION

//#if (defined(TPD_WARP_START) && defined(TPD_WARP_END))
//#define TPD_DO_WARP
int TPD_DO_WARP = 0;
int tpd_wb_start[TPD_WARP_CNT] = {0};
int tpd_wb_end[TPD_WARP_CNT]   = {0};

void tpd_warp_calibrate(int *x, int *y) {
    int wx = *x, wy = *y;
    if(wx<tpd_wb_start[0] && tpd_wb_start[0]>0) {
        wx = tpd_wb_start[0]-((tpd_wb_start[0]-wx)*(tpd_wb_start[0]-tpd_wb_end[0])/(tpd_wb_start[0]));
        //wx = wx*(tpd_wb_start[0]-tpd_wb_end[0])/tpd_wb_start[0]+tpd_wb_end[0];
    }
    else if(wx>tpd_wb_start[2])
        wx = (wx-tpd_wb_start[2])*(tpd_wb_end[2]-tpd_wb_start[2])/(TPD_RES_X-tpd_wb_start[2])+tpd_wb_start[2];

    if(wy<tpd_wb_start[1] && tpd_wb_start[1]>0)
        wy = tpd_wb_start[1]-((tpd_wb_start[1]-wy)*(tpd_wb_start[1]-tpd_wb_end[1])/(tpd_wb_start[1]));
        //wy = wy*(tpd_wb_start[1]-tpd_wb_end[1])/tpd_wb_start[1]+tpd_wb_end[1];
    else if(wy>tpd_wb_start[3] && wy<=TPD_RES_Y)
        wy = (wy-tpd_wb_start[3])*(tpd_wb_end[3]-tpd_wb_start[3])/(TPD_RES_Y-tpd_wb_start[3])+tpd_wb_start[3];
    if(wy<0) wy=0;
    if(wx<0) wx=0;
    *x = wx, *y = wy;
}
//#else
//#define tpd_warp_calibrate(x,y)
//#endif

void tpd_calibrate(int *x, int *y) {
    int tx, i;
    if(tpd_calmat[0]==0) for(i=0;i<6;i++) tpd_calmat[i]=tpd_def_calmat[i];
    /* ================ calibrating ================*/
    tx      = ((tpd_calmat[0]*(*x))+(tpd_calmat[1]*(*y))+(tpd_calmat[2]))>>12;
    *y      = ((tpd_calmat[3]*(*x))+(tpd_calmat[4]*(*y))+(tpd_calmat[5]))>>12;
    *x      = tx;
    
		if(TPD_DO_WARP == 1) tpd_warp_calibrate(x, y);      
    *x = (*x) + ((*y)*(*x)*tpd_calmat[6]/TPD_RES_X)/TPD_RES_Y;
    *y = (*y) + ((*y)*(*x)*tpd_calmat[7]/TPD_RES_X)/TPD_RES_Y;
}

//#endif

//#endif

