anchor.diff:  vec4 rev_rgb2xyz(vec4 color) {
   	//Observer. = 2.0°, Illuminant = D65
   	vec3 rgb = vec3(rev_sRGB(color.r), rev_sRGB(color.g), rev_sRGB(color.b)) * 100.0;							
  -	mat3 M = mat3(0.4124, 0.3576, 0.1805,    0.2126, 0.7152, 0.0722,    0.0193, 0.1192, 0.9505);
  -	return vec4(rgb * M, color.a);
  -}
  +	return vec4(rgb * MsRGBINV, color.a);
  +}
  +
  +///////////////////////// Lab/lch /////////////////////////////////////////
  +// fwd XYZ [0..100] -> L[0..100] AB[-128..+128] -> L[0..100] C[0..100] H[0..360]
  +// rev L[0..100] C[0..100] H[0..360] -> L[0..100] AB[-128..+128] -> XYZ [0..100]
   
   // convert xyz component to lab component
   float fwd_lab(float c) {
  
positive.code: }
  
  void main( void ) {
  	vec4 lch = rgb_to_lch(texture2D(u_tex0, v_uv));
  	if (u_numEdges > 9.0) {					// u_numEdges 0 = no edges, 10 = 1 edge, 20 = 2 edges, 30 = 3 edges, etc.
  		float dx = 1000.0 / (u_numEdges);		// dx is width of grey bands 100 for 1 edge, 50 for 2 edges, 33 for 3 edges, 25 for 4 edges, etc
  		float lx = max(lch.x, dx * u_maskDark / 10.0);				// clamp out n dark bands eg 0 = show all, 10 = no blacks, 20=no blacks or darks
  
negative.code: 
  	lch.y = lch.y * (1.0 + u_maxContrast/50.0);														// optionally amp the chroma
  	lch.y = lch.y * u_showColors / 100.0;
  
  	gl_FragColor = rev_jch2rgb(lch);
  }