plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

rgbycc.c (2516B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <draw.h>
      4 
      5 float c1 = 1.402;
      6 float c2 = 0.34414;
      7 float c3 = 0.71414;
      8 float c4 = 1.772;
      9 
     10 int
     11 closest(int Y, int Cb, int Cr)
     12 {
     13 	double r, g, b;
     14 	double diff, min;
     15 	int rgb, R, G, B, v, i;
     16 	int y1, cb1, cr1;
     17 
     18 	Cb -= 128;
     19 	Cr -= 128;
     20 	r = Y+c1*Cr;
     21 	g = Y-c2*Cb-c3*Cr;
     22 	b = Y+c4*Cb;
     23 
     24 /*print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b); */
     25 
     26 	min = 1000000.;
     27 	v = 1000;
     28 	for(i=0; i<256; i++){
     29 		rgb =  cmap2rgb(i);
     30 		R = (rgb >> 16) & 0xFF;
     31 		G = (rgb >> 8) & 0xFF;
     32 		B = (rgb >> 0) & 0xFF;
     33 		diff = (R-r)*(R-r) + (G-g)*(G-g) + (B-b)*(B-b);
     34 		y1 = 0.5870*G + 0.114*B + 0.299*R;
     35 		cb1 = (B-y1)/1.772;
     36 		cr1 = (R-y1)/1.402;
     37 		if(diff < min){
     38 /*			if(Y==0 && y1!=0) */
     39 /*				continue; */
     40 			if(Y==256-16 && y1<256-16)
     41 				continue;
     42 /*			if(Cb==0 && cb1!=0) */
     43 /*				continue; */
     44 			if(Cb==256-16 && cb1<256-16)
     45 				continue;
     46 /*			if(Cr==0 && cr1!=0) */
     47 /*				continue; */
     48 			if(Cr==256-16 && cr1<256-16)
     49 				continue;
     50 /*print("%d %d %d\n", R, G, B); */
     51 			min = diff;
     52 			v = i;
     53 		}
     54 	}
     55 	if(v > 255)
     56 		abort();
     57 	return v;
     58 }
     59 
     60 void
     61 main(int argc, char *argv[])
     62 {
     63 	int i, rgb;
     64 	int r, g, b;
     65 	double Y, Cr, Cb;
     66 	int y, cb, cr;
     67 	uchar close[16*16*16];
     68 
     69 /*print("%d\n", closest(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]))); */
     70 /*exits("X"); */
     71 
     72 	/* ycbcrmap */
     73 	print("uint ycbcrmap[256] = {\n");
     74 	for(i=0; i<256; i++){
     75 		if(i%8 == 0)
     76 			print("\t");
     77 		rgb = cmap2rgb(i);
     78 		r = (rgb>>16) & 0xFF;
     79 		g = (rgb>>8) & 0xFF;
     80 		b = (rgb>>0) & 0xFF;
     81 		Y = 0.5870*g + 0.114*b + 0.299*r;
     82 		Cr = (r-Y)/1.402 + 128.;
     83 		Cb = (b-Y)/1.772 + 128.;
     84 		if(Y<0. || Y>=256. || Cr<0. || Cr>=256. || Cb<0. || Cb>=256.)
     85 			print("bad at %d: %d %d %d; %g %g %g\n", i, r, g, b, Y, Cb, Cr);
     86 		r = Y;
     87 		g = Cb;
     88 		b = Cr;
     89 		print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
     90 		if(i%8 == 7)
     91 			print("\n");
     92 	}
     93 	print("};\n\n");
     94 
     95 	/* closestycbcr */
     96 	print("uchar closestycbcr[16*16*16] = {\n");
     97 	for(y=0; y<256; y+=16)
     98 	for(cb=0; cb<256; cb+=16)
     99 	for(cr=0; cr<256; cr+=16)
    100 		close[(cr/16)+16*((cb/16)+16*(y/16))] = closest(y, cb, cr);
    101 if(0){
    102 	/*weird: set white for nearly white */
    103 	for(cb=128-32; cb<=128+32; cb+=16)
    104 	for(cr=128-32; cr<=128+32; cr+=16)
    105 		close[(cr/16)+16*((cb/16)+16*(255/16))] = 0;
    106 	/*weird: set black for nearly black */
    107 	for(cb=128-32; cb<=128+32; cb+=16)
    108 	for(cr=128-32; cr<=128+32; cr+=16)
    109 		close[(cr/16)+16*((cb/16)+16*(0/16))] = 255;
    110 }
    111 	for(i=0; i<16*16*16; i++){
    112 		if(i%16 == 0)
    113 			print("\t");
    114 		print("%d,", close[i]);
    115 		if(i%16 == 15)
    116 			print("\n");
    117 	}
    118 	print("};\n\n");
    119 	exits(nil);
    120 }