diff options
author | rsc <devnull@localhost> | 2004-04-21 22:19:33 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-21 22:19:33 +0000 |
commit | 28994509cc11ac6a5443054dfae1fedfb69039bc (patch) | |
tree | 9d5adcd11af2708db0ecc246e008c308ca0f97d4 /src/cmd/jpg/close.c | |
parent | a01e58366c54804f15f84d6e21d13f2e4080977a (diff) | |
download | plan9port-28994509cc11ac6a5443054dfae1fedfb69039bc.tar.gz plan9port-28994509cc11ac6a5443054dfae1fedfb69039bc.tar.bz2 plan9port-28994509cc11ac6a5443054dfae1fedfb69039bc.zip |
Why not?
Diffstat (limited to 'src/cmd/jpg/close.c')
-rw-r--r-- | src/cmd/jpg/close.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/cmd/jpg/close.c b/src/cmd/jpg/close.c new file mode 100644 index 00000000..7a260c10 --- /dev/null +++ b/src/cmd/jpg/close.c @@ -0,0 +1,121 @@ +#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; +} + +#define SHIFT 5 +#define INC (1<<SHIFT) + +typedef struct Color Color; + +struct Color +{ + int col; + Color *next; +}; + +Color *col[INC*INC*INC]; + +void +add(int c, int y, int cb, int cr) +{ + Color *cp; + + y >>= 8-SHIFT; + cb >>= 8-SHIFT; + cr >>= 8-SHIFT; + cp = col[cr+INC*(cb+INC*y)]; + while(cp != nil){ + if(cp->col == c) + return; + cp = cp->next; + } + cp = malloc(sizeof(Color)); + cp->col = c; + cp->next = col[cr+INC*(cb+INC*y)]; + col[cr+INC*(cb+INC*y)] = cp; +} + +void +main(void) +{ + int y, cb, cr, n; + Color *cp; + + for(y=0; y<256; y++){ + for(cb=0; cb<256; cb++) + for(cr=0;cr<256;cr++) + add(closest(y, cb, cr), y, cb, cr); + fprint(2, "%d done\n", y); + } + for(y=0; y<INC*INC*INC; y++){ + n = 0; + cp = col[y]; + while(cp != nil){ + n++; + cp = cp->next; + } + cp = col[y]; + while(cp != nil){ + n++; + print("%d ", cp->col); + cp = cp->next; + } + print("\n"); + } +} |