/*
 *		UGLY CODE INSIDE
 */
#include <stdio.h>
#include <stdlib.h>
#include  <stdint.h>
#include "../floatimg.h"

#include  "funcs.h"

extern	int	verbosity;

/*
 *		Be careful, these functions are not yet fireproof,
 *		and calling conventions are fluctuating.
 */

/* --------------------------------------------------------------------- */
int x_upscaler_0(unsigned char *src, int w, int h, FloatImg *d)
{
int				x, y, xx, yy, ox, oy;
// float				*rp, *gp, *bp;
float				r, g, b;
static unsigned short		modz;

/*
 *	check in image sizes are correct
 */
if ( d->width != w*2 || d->height != h*2 ) {
	fprintf(stderr, "%s: dimension error\n", __func__);
	fprintf(stderr, "\tw = %d   h = %d\n", w, h);
	fprintf(stderr, "\tdest image is %dx%d\n", d->width, d->height);
#if MUST_ABORT
	abort();
#endif
	return -2;
	}

ox = ! ! (modz & 2);
oy = ! ! (modz & 1);

if (verbosity>2)	fprintf(stderr, "%s   %5d  %d %d\n", __func__,
					modz, ox, oy);

for (y=0; y<h; y++) {
	yy = (y*2) + oy;
	for (x=0; x<w; x++) {
		xx = (x*2) + ox;
		r = (float)*src++;
		g = (float)*src++;
		b = (float)*src++;

		/* may be, here, we can speed up the job */
		fimg_add_rgb(d, xx, yy, r, g, b);
		/* or may be jump directly to asm and SSE2
		   http://www.mikekohn.net/stuff/image_processing.php */
		}
	} 

modz++;			/* next displacment index */

if ( ! (modz & 0x03)) {
	d->count++;		/* one more frame in the accumulator */
	}

return -1;
}
/* --------------------------------------------------------------------- */
int x_rgb2fimg(unsigned char *src, int w, int h, FloatImg *d)
{
int			iter, size;
float			*rp, *gp, *bp;

size = w * h;
rp = d->R, gp = d->G, bp = d->B;

for (iter=0; iter<size; iter++) {
	*rp++ = (float)*src++;
	*gp++ = (float)*src++;
	*bp++ = (float)*src++;
	}

return 0;
}
/* --------------------------------------------------------------------- */
int x_add_rgb2fimg(unsigned char *src, int w, int h, FloatImg *d)
{
int			iter, size;
float			*rp, *gp, *bp;

#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p  %d %d  %p )\n", __func__,
				src, w, h, d);
#endif

size = w * h;
rp = d->R, gp = d->G, bp = d->B;

for (iter=0; iter<size; iter++) {
	*rp++ += (float)*src++;
	*gp++ += (float)*src++;
	*bp++ += (float)*src++;
	}

d->count++;		/* one more frame in the accumulator */

return 0;
}
/* --------------------------------------------------------------------- */

int x_rgb2file(unsigned char *src, int w, int h, char *fname)
{
FloatImg		buff;
int			foo;

#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p %d %d '%s' )\n", __func__,
			src, w, h, fname);
#endif

foo = fimg_create(&buff, w, h, FIMG_TYPE_RGB);
if (foo) {
	fprintf(stderr, "Crash on create in %s %s\n", __FILE__, __func__);
	exit(1);
	}

foo = x_rgb2fimg(src, w, h, &buff);
if (foo) {
	fprintf(stderr, "Crash on bit massage in %s %s\n", __FILE__, __func__);
	exit(1);
	}

foo = fimg_dump_to_file(&buff, fname, 0);
if (foo) {
	fprintf(stderr, "Crash on dump in %s %s\n", __FILE__, __func__);
	exit(1);
	}

fimg_destroy(&buff);

return -1;
}
/* --------------------------------------------------------------------- */