% redpart (1,1,0,0) crashes

% let normalredpart     = redpart ;
% let normalgreenpart   = greenpart ;
% let normalbluepart    = bluepart ;
% let normalcyanpart    = cyanpart ;
% let normalmagentapart = magentapart ;
% let normalyellowpart  = yellowpart ;
% let normalblackpart   = blackpart ;

% vardef redpart     expr p = if cmykcolor p : 1 - normalcyanpart    p elseif rgbcolor p :     normalredpart   p else : p fi enddef ;
% vardef greenpart   expr p = if cmykcolor p : 1 - normalmagentapart p elseif rgbcolor p :     normalgreenpart p else : p fi enddef ;
% vardef bluepart    expr p = if cmykcolor p : 1 - normalyellowpart  p elseif rgbcolor p :     normalbluepart  p else : p fi enddef ;
% vardef cyanpart    expr p = if cmykcolor p :     normalcyanpart    p elseif rgbcolor p : 1 - normalredpart   p else : p fi enddef ;
% vardef magentapart expr p = if cmykcolor p :     normalmagentapart p elseif rgbcolor p : 1 - normalgreenpart p else : p fi enddef ;
% vardef yellowpart  expr p = if cmykcolor p :     normalyellowpart  p elseif rgbcolor p : 1 - normalbluepart  p else : p fi enddef ;
% vardef blackpart   expr p = if cmykcolor p :     normalblackpart   p elseif rgbcolor p :                     0 else : p fi enddef ;

vardef rcomponent expr p = if rgbcolor  p : redpart     p elseif cmykcolor p : 1 - cyanpart    p else : p fi enddef ;
vardef gcomponent expr p = if rgbcolor  p : greenpart   p elseif cmykcolor p : 1 - magentapart p else : p fi enddef ;
vardef bcomponent expr p = if rgbcolor  p : bluepart    p elseif cmykcolor p : 1 - yellowpart  p else : p fi enddef ;
vardef ccomponent expr p = if cmykcolor p : cyanpart    p elseif rgbcolor  p : 1 - redpart     p else : p fi enddef ;
vardef mcomponent expr p = if cmykcolor p : magentapart p elseif rgbcolor  p : 1 - greenpart   p else : p fi enddef ;
vardef ycomponent expr p = if cmykcolor p : yellowpart  p elseif rgbcolor  p : 1 - bluepart    p else : p fi enddef ;
vardef bcomponent expr p = if cmykcolor p : blackpart   p elseif rgbcolor  p :                 0 else : p fi enddef ;

vardef somecolor = (1,1,0,0) enddef ;

fill OverlayBox withcolor (rcomponent somecolor,gcomponent somecolor,bcomponent somecolor) ;
fill OverlayBox withcolor (ccomponent somecolor,mcomponent somecolor,ycomponent somecolor,bcomponent somecolor) ;

% def newcolor     text v = forsuffixes i=v : save i ; color     i ; endfor ; enddef ;
% def newnumeric   text v = forsuffixes i=v : save i ; numeric   i ; endfor ; enddef ;
% def newboolean   text v = forsuffixes i=v : save i ; boolean   i ; endfor ; enddef ;
% def newtransform text v = forsuffixes i=v : save i ; transform i ; endfor ; enddef ;
% def newpath      text v = forsuffixes i=v : save i ; path      i ; endfor ; enddef ;
% def newpicture   text v = forsuffixes i=v : save i ; picture   i ; endfor ; enddef ;
% def newstring    text v = forsuffixes i=v : save i ; string    i ; endfor ; enddef ;

% width := 10 ;
% beginfig(1) ;
%   newpath width, height ; width := origin -- cycle ;
% endfig ;
% width := 10 ;
