Blob
1 #include <u.h>2 #include <libc.h>3 #include <draw.h>5 float c1 = 1.402;6 float c2 = 0.34414;7 float c3 = 0.71414;8 float c4 = 1.772;11 int12 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;19 Cb -= 128;20 Cr -= 128;21 r = Y+c1*Cr;22 g = Y-c2*Cb-c3*Cr;23 b = Y+c4*Cb;25 //print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b);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 }61 #define SHIFT 562 #define INC (1<<SHIFT)64 typedef struct Color Color;66 struct Color67 {68 int col;69 Color *next;70 };72 Color *col[INC*INC*INC];74 void75 add(int c, int y, int cb, int cr)76 {77 Color *cp;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 }94 void95 main(void)96 {97 int y, cb, cr, n;98 Color *cp;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 }