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

unsigned char c1, c2, c3, c4, *argbbuf;
unsigned char r, g, b, a;
unsigned int i1, i2, i3, i4;
float readintelfloat(), *buf, getrms();

main ()
	{
	int nx, ny, i, index;
	float val, max, rms;
	/* read two integers from front of file, nx and ny */
	nx = readintelint();
	ny = readintelint();
	if (nx < 1 || ny < 1 || nx > 1000000 || ny > 1000000)
		{
		fprintf(stderr, "convimage: nx=%d ny=%d improper, abort\n",
			nx, ny);
		exit(-1);
		}
	/* read five more integers from front (20 extra bytes); the last is a one */
	for (i=0; i<5; i++)
		index = readintelint();
	if (index != 1)
		fprintf(stderr,
		"convimage: warning, unexpected seventh integer=%d\n", index);
	fprintf(stderr, "convimage: nx=%d ny=%d\n", nx, ny);
	buf = (float *)malloc(nx*ny*sizeof(float));
	max = 0;
	for (i=0; i < nx*ny; i++)
		{
		val = readintelfloat();
		if (val < -1e30 || val > 1e30)
			{
			fprintf(stderr, "convimage: i=%d val=%g improper, abort\n",
				i, val);
			exit(-1);
			}
		val = (val<0 ? -1 : 1)*
			(float)(pow((double)(val<0 ? -val : val), (double)(0.8)));
		if ((val<0 ? -val : val) > max)
			max = val<0 ? -val : val;
		buf[i] = val;
		}
	rms = getrms(nx*ny);
	argbbuf = (unsigned char *)malloc(nx*ny*4);
	for (i=0; i < nx*ny; i++)
		{
		/*
		index = (int)(127.5 + buf[i]/max*127.5);
		a = (unsigned char)(255);
		r = (unsigned char)(index);
		g = (unsigned char)(index);
		b = (unsigned char)(index);
		*/
		if (buf[i] >= 0)
			{
			index = (int)(255 - (buf[i]/3/rms*255));
			if (index > 255)
				index = 255;
			if (index < 0)
				index = 0;
			a = (unsigned char)(255);
			r = (unsigned char)(255);
			g = (unsigned char)(index);
			b = (unsigned char)(index);
			}
		else
			{
			index = (int)(255 + (buf[i]/3/rms*255));
			if (index > 255)
				index = 255;
			if (index < 0)
				index = 0;
			a = (unsigned char)(255);
			r = (unsigned char)(index);
			g = (unsigned char)(index);
			b = (unsigned char)(255);
			}
		/*writeargb();*/
		argbbuf[4*i] = a;
		argbbuf[4*i + 1] = r;
		argbbuf[4*i + 2] = g;
		argbbuf[4*i + 3] = b;
		}
	write(1, argbbuf, nx*ny*4);
	}

int readintelint()
	{
	read(0, &c4, 1);
	read(0, &c3, 1);
	read(0, &c2, 1);
	read(0, &c1, 1);
	i1 = c1;
	i2 = c2;
	i3 = c3;
	i4 = c4;
	/*fprintf(stderr, "%d %d %d %d\n", i1<<24, i2<<16, i3<<8, i4);*/
	return((i1<<24) + (i2<<16) + (i3<<8) + i4);
	/*return((i1*16777216) + (i2*65536) + (i3*256) + i4);*/
	}

float readintelfloat()
	{
	unsigned ibuf;
	float fval, *fv;
	read(0, &c4, 1);
	read(0, &c3, 1);
	read(0, &c2, 1);
	read(0, &c1, 1);
	i1 = c1;
	i2 = c2;
	i3 = c3;
	i4 = c4;
	ibuf = i1<<24 | i2<<16 | i3<<8 | i4;
	fv = (float *)(&ibuf);
	fval = *fv;
	return(fval);
	}

writeargb()
	{
	write(1, &a, 1);
	write(1, &r, 1);
	write(1, &g, 1);
	write(1, &b, 1);
	}

float getrms(n)
int n;
	{
	int j;
	float sum;
	sum = 0;
	for (j=0; j<n; j++)
		sum += buf[j] * buf[j];
	sum /= n;
	return((float)(sqrt((double)(sum))));
	}
	