% This macro package is exactly like boxes.mp except that it defines
% an additional macro rboxit<box name>(<string or picture>) that produces
% rectangular boxes with rounded corners.

\input boxes




% Rectangular boxes with rounded corners

newinternal rbox_radius;
rbox_radius := 8bp;

vardef rboxit@#(text tt) =
  beginbox_("rboxpath_","sizebox_",@#,tt);
  generic_declare(pair) _n.sw, _n.s, _n.se, _n.e, _n.ne, _n.n, _n.nw, _n.w;
  0 = xpart (@#nw-@#sw) = ypart(@#se-@#sw);
  0 = xpart(@#ne-@#se) = ypart(@#ne-@#nw);
  @#w = .5[@#nw,@#sw];
  @#s = .5[@#sw,@#se];
  @#e = .5[@#ne,@#se];
  @#n = .5[@#ne,@#nw];
  @#ne-@#c = @#c-@#sw = (@#dx,@#dy) + .5*(urcorner pic_@# - llcorner pic_@#);
  endbox_(clearb_,@#);
enddef;

def rboxpath_(suffix $) =
  save _r;
  _r = min(rbox_radius, .5*ypart($.n-$.s), .5*xpart($.e-$.w));
  $.sw+(_r,0) {right}..{right} $.se-(_r,0)
  ..$.se+(0,_r) {up}..{up} $.ne-(0,_r)
  ..$.ne-(_r,0) {left}..{left} $.nw+(_r,0)
  ..$.nw-(0,_r) {down}..{down} $.sw+(0,_r) .. cycle
enddef;


% sizebox_ and clearb_ are defined in boxes.mp
