/* @(#)  Program to calculate the stdev of the differnce image
 * @(#) at a given displacement vector
 *
 * Written : 25/11/1987
 * Author : N. Dessipris
 * Updated : 2/12/1991
 * 22/7/93 JC
 *	- im_incheck() added
 */

/*

    This file is part of VIPS.
    
    VIPS is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */

/*

    These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk

 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <vips/vips.h>
#include <vips/internal.h>

#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/

int im_dif_std(im, xpos, ypos, xsize, ysize, dx, dy, pmean, pstd)
IMAGE *im;
int xpos, ypos, xsize, ysize; /* location of the box within im */
int dx, dy; /* displacements */
double *pmean, *pstd;
{
	PEL *input, *cpinput;
	double m, s;
	int *buf, *pbuf;
	int x, y;
	int ofst, bufsize;


	if( im_incheck( im ) )
		return( -1 );

	if ((im->Bands != 1)||(im->BandFmt != IM_BANDFMT_UCHAR)) {
		im_error( "im_dif_std", "%s", _( "Unable to accept input") ); 
		return(-1);}
	if ( (xpos + xsize + dx > im->Xsize)|| (ypos + ysize + dy > im->Ysize) ) { 
		im_error( "im_dif_std", "%s", _( "wrong args") ); 
		return(-1); }

	bufsize = xsize * ysize;
	buf = (int *)calloc( (unsigned)bufsize, sizeof(int) );
	if ( buf == NULL ) { 
		im_error( "im_dif_std", "%s", _( "calloc failed") ); 
		return(-1); }
	input = (PEL*)im->data;
	input += ( ypos * im->Xsize + xpos );
	ofst = dy * im->Xsize + dx;
	pbuf = buf;
	for ( y=0; y<ysize; y++ )
		{
		cpinput = input;
		input += im->Xsize;
		for ( x=0; x<xsize; x++ )
			{
			*pbuf++ = ((int)(*cpinput))-((int)(*(cpinput + ofst)));
			cpinput++;
			}
		}

	m = 0.0; s = 0.0;
	if( im__mean_std_int_buffer( buf, bufsize, &m, &s ) )
		return(-1);
	*pmean = m;
	*pstd = s;
	free((char*)buf);

	return(0);
}
