| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | function hex2RGB(h) { | 
					
						
							|  |  |  | 	var o = h.substr(h[0]==="#"?1:0,6); | 
					
						
							|  |  |  | 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function rgb2Hex(rgb) { | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 	for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); | 
					
						
							|  |  |  | 	return o.toString(16).toUpperCase().substr(1); | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | function rgb2HSL(rgb) { | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 	var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255; | 
					
						
							|  |  |  | 	var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m; | 
					
						
							|  |  |  | 	if(C === 0) return [0, 0, R]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var H6 = 0, S = 0, L2 = (M + m); | 
					
						
							|  |  |  | 	S = C / (L2 > 1 ? 2 - L2 : L2); | 
					
						
							|  |  |  | 	switch(M){ | 
					
						
							|  |  |  | 		case R: H6 = ((G - B) / C + 6)%6; break; | 
					
						
							|  |  |  | 		case G: H6 = ((B - R) / C + 2); break; | 
					
						
							|  |  |  | 		case B: H6 = ((R - G) / C + 4); break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return [H6 / 6, S, L2 / 2]; | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | function hsl2RGB(hsl){ | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 	var H = hsl[0], S = hsl[1], L = hsl[2]; | 
					
						
							|  |  |  | 	var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2; | 
					
						
							|  |  |  | 	var rgb = [m,m,m], h6 = 6*H; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var X; | 
					
						
							|  |  |  | 	if(S !== 0) switch(h6|0) { | 
					
						
							|  |  |  | 		case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break; | 
					
						
							|  |  |  | 		case 1: X = C * (2 - h6);   rgb[0] += X; rgb[1] += C; break; | 
					
						
							|  |  |  | 		case 2: X = C * (h6 - 2);   rgb[1] += C; rgb[2] += X; break; | 
					
						
							|  |  |  | 		case 3: X = C * (4 - h6);   rgb[1] += X; rgb[2] += C; break; | 
					
						
							|  |  |  | 		case 4: X = C * (h6 - 4);   rgb[2] += C; rgb[0] += X; break; | 
					
						
							|  |  |  | 		case 5: X = C * (6 - h6);   rgb[2] += X; rgb[0] += C; break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255); | 
					
						
							|  |  |  | 	return rgb; | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* 18.8.3 bgColor tint algorithm */ | 
					
						
							|  |  |  | function rgb_tint(hex, tint) { | 
					
						
							|  |  |  | 	if(tint === 0) return hex; | 
					
						
							|  |  |  | 	var hsl = rgb2HSL(hex2RGB(hex)); | 
					
						
							|  |  |  | 	if (tint < 0) hsl[2] = hsl[2] * (1 + tint); | 
					
						
							|  |  |  | 	else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint); | 
					
						
							|  |  |  | 	return rgb2Hex(hsl2RGB(hsl)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 18.3.1.13 width calculations */ | 
					
						
							|  |  |  | var DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW; | 
					
						
							|  |  |  | function width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; } | 
					
						
							|  |  |  | function px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; } | 
					
						
							|  |  |  | function char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; } | 
					
						
							|  |  |  | function cycle_width(collw) { return char2width(px2char(width2px(collw))); } | 
					
						
							|  |  |  | function find_mdw(collw, coll) { | 
					
						
							|  |  |  | 	if(cycle_width(collw) != collw) { | 
					
						
							|  |  |  | 		for(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break; | 
					
						
							|  |  |  | 		if(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break; | 
					
						
							|  |  |  | 		if(MDW === MAX_MDW) MDW = DEF_MDW; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |