plan9port

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

close.c (1981B)


      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 
     11 int
     12 closest(int Y, int Cb, int Cr)
     13 {
     14 	double r, g, b;
     15 	double diff, min;
     16 	int rgb, R, G, B, v, i;
     17 	int y1, cb1, cr1;
     18 
     19 	Cb -= 128;
     20 	Cr -= 128;
     21 	r = Y+c1*Cr;
     22 	g = Y-c2*Cb-c3*Cr;
     23 	b = Y+c4*Cb;
     24 
     25 /*print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b); */
     26 
     27 	min = 1000000.;
     28 	v = 1000;
     29 	for(i=0; i<256; i++){
     30 		rgb =  cmap2rgb(i);
     31 		R = (rgb >> 16) & 0xFF;
     32 		G = (rgb >> 8) & 0xFF;
     33 		B = (rgb >> 0) & 0xFF;
     34 		diff = (R-r)*(R-r) + (G-g)*(G-g) + (B-b)*(B-b);
     35 /*		y1 = 0.5870*G + 0.114*B + 0.299*R; */
     36 /*		cb1 = (B-y1)/1.772; */
     37 /*		cr1 = (R-y1)/1.402; */
     38 		if(diff < min){
     39 /*			if(Y==0 && y1!=0) */
     40 /*				continue; */
     41 /*			if(Y==256-16 && y1<256-16) */
     42 /*				continue; */
     43 /*			if(Cb==0 && cb1!=0) */
     44 /*				continue; */
     45 /*			if(Cb==256-16 && cb1<256-16) */
     46 /*				continue; */
     47 /*			if(Cr==0 && cr1!=0) */
     48 /*				continue; */
     49 /*			if(Cr==256-16 && cr1<256-16) */
     50 /*				continue; */
     51 /*print("%d %d %d\n", R, G, B); */
     52 			min = diff;
     53 			v = i;
     54 		}
     55 	}
     56 	if(v > 255)
     57 		abort();
     58 	return v;
     59 }
     60 
     61 #define 	SHIFT	5
     62 #define	INC		(1<<SHIFT)
     63 
     64 typedef struct Color Color;
     65 
     66 struct Color
     67 {
     68 	int		col;
     69 	Color	*next;
     70 };
     71 
     72 Color	*col[INC*INC*INC];
     73 
     74 void
     75 add(int c, int y, int cb, int cr)
     76 {
     77 	Color *cp;
     78 
     79 	y >>= 8-SHIFT;
     80 	cb >>= 8-SHIFT;
     81 	cr >>= 8-SHIFT;
     82 	cp = col[cr+INC*(cb+INC*y)];
     83 	while(cp != nil){
     84 		if(cp->col == c)
     85 			return;
     86 		cp = cp->next;
     87 	}
     88 	cp = malloc(sizeof(Color));
     89 	cp->col = c;
     90 	cp->next = col[cr+INC*(cb+INC*y)];
     91 	col[cr+INC*(cb+INC*y)] = cp;
     92 }
     93 
     94 void
     95 main(void)
     96 {
     97 	int y, cb, cr, n;
     98 	Color *cp;
     99 
    100 	for(y=0; y<256; y++){
    101 		for(cb=0; cb<256; cb++)
    102 			for(cr=0;cr<256;cr++)
    103 				add(closest(y, cb, cr), y, cb, cr);
    104 		fprint(2, "%d done\n", y);
    105 	}
    106 	for(y=0; y<INC*INC*INC; y++){
    107 		n = 0;
    108 		cp = col[y];
    109 		while(cp != nil){
    110 			n++;
    111 			cp = cp->next;
    112 		}
    113 		cp = col[y];
    114 		while(cp != nil){
    115 			n++;
    116 			print("%d ", cp->col);
    117 			cp = cp->next;
    118 		}
    119 		print("\n");
    120 	}
    121 }