Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_fixcpp/sys/src/cmd/jpg/close.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}