#include <u.h>
#include <libc.h>
#include <draw.h>

float c1 = 1.402;
float c2 = 0.34414;
float c3 = 0.71414;
float c4 = 1.772;

int
closest(int Y, int Cb, int Cr)
{
	double r, g, b;
	double diff, min;
	int rgb, R, G, B, v, i;
	int y1, cb1, cr1;

	Cb -= 128;
	Cr -= 128;
	r = Y+c1*Cr;
	g = Y-c2*Cb-c3*Cr;
	b = Y+c4*Cb;

/*print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b); */

	min = 1000000.;
	v = 1000;
	for(i=0; i<256; i++){
		rgb =  cmap2rgb(i);
		R = (rgb >> 16) & 0xFF;
		G = (rgb >> 8) & 0xFF;
		B = (rgb >> 0) & 0xFF;
		diff = (R-r)*(R-r) + (G-g)*(G-g) + (B-b)*(B-b);
		y1 = 0.5870*G + 0.114*B + 0.299*R;
		cb1 = (B-y1)/1.772;
		cr1 = (R-y1)/1.402;
		if(diff < min){
/*			if(Y==0 && y1!=0) */
/*				continue; */
			if(Y==256-16 && y1<256-16)
				continue;
/*			if(Cb==0 && cb1!=0) */
/*				continue; */
			if(Cb==256-16 && cb1<256-16)
				continue;
/*			if(Cr==0 && cr1!=0) */
/*				continue; */
			if(Cr==256-16 && cr1<256-16)
				continue;
/*print("%d %d %d\n", R, G, B); */
			min = diff;
			v = i;
		}
	}
	if(v > 255)
		abort();
	return v;
}

void
main(int argc, char *argv[])
{
	int i, rgb;
	int r, g, b;
	double Y, Cr, Cb;
	int y, cb, cr;
	uchar close[16*16*16];

/*print("%d\n", closest(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]))); */
/*exits("X"); */

	/* ycbcrmap */
	print("uint ycbcrmap[256] = {\n");
	for(i=0; i<256; i++){
		if(i%8 == 0)
			print("\t");
		rgb = cmap2rgb(i);
		r = (rgb>>16) & 0xFF;
		g = (rgb>>8) & 0xFF;
		b = (rgb>>0) & 0xFF;
		Y = 0.5870*g + 0.114*b + 0.299*r;
		Cr = (r-Y)/1.402 + 128.;
		Cb = (b-Y)/1.772 + 128.;
		if(Y<0. || Y>=256. || Cr<0. || Cr>=256. || Cb<0. || Cb>=256.)
			print("bad at %d: %d %d %d; %g %g %g\n", i, r, g, b, Y, Cb, Cr);
		r = Y;
		g = Cb;
		b = Cr;
		print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
		if(i%8 == 7)
			print("\n");
	}
	print("};\n\n");

	/* closestycbcr */
	print("uchar closestycbcr[16*16*16] = {\n");
	for(y=0; y<256; y+=16)
	for(cb=0; cb<256; cb+=16)
	for(cr=0; cr<256; cr+=16)
		close[(cr/16)+16*((cb/16)+16*(y/16))] = closest(y, cb, cr);
if(0){
	/*weird: set white for nearly white */
	for(cb=128-32; cb<=128+32; cb+=16)
	for(cr=128-32; cr<=128+32; cr+=16)
		close[(cr/16)+16*((cb/16)+16*(255/16))] = 0;
	/*weird: set black for nearly black */
	for(cb=128-32; cb<=128+32; cb+=16)
	for(cr=128-32; cr<=128+32; cr+=16)
		close[(cr/16)+16*((cb/16)+16*(0/16))] = 255;
}
	for(i=0; i<16*16*16; i++){
		if(i%16 == 0)
			print("\t");
		print("%d,", close[i]);
		if(i%16 == 15)
			print("\n");
	}
	print("};\n\n");
	exits(nil);
}
