%D \module
%D   [       file=mp-fobg.mp,
%D        version=2004.03.12,
%D          title=\CONTEXT\ \METAPOST\ graphics,
%D       subtitle=Formatting Objects,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
%C details.

if unknown context_tool :    input mp-tool ; fi ;
if   known context_fobg : endinput         ; fi ;

boolean context_fobg ; context_fobg := true ;

FoNone   := 0 ; FoHidden := 1 ; FoDotted := 2 ; FoDashed := 3 ; FoSolid  := 4 ;
FoDouble := 5 ; FoGroove := 6 ; FoRidge  := 7 ; FoInset  := 8 ; FoOutset := 9 ;
FoAll    := 0 ; FoTop    := 1 ; FoBottom := 2 ; FoLeft   := 3 ; FoRight  := 4 ;
FoMedium := .5pt ; FoThin := FoMedium/2 ; FoThick := FoMedium*2 ;

color FoBackgroundColor, FoNoColor, FoLineColor[] ; FoNoColor := (-1,-1,-1) ;
numeric FoLineWidth[], FoLineStyle[] ;
boolean FoFrame, FoBackground, FoSplit ;

FoFrame := FoBackground := FoSplit := false ;
FoBackgroundColor := white ;
FoDashFactor := .5 ;
FoDotFactor := .375 ;

for i = FoAll upto FoRight :
  FoLineColor[i] := black ;
  FoLineWidth[i] := .5pt ;
  FoLineStyle[i] := FoNone ;
endfor ;

def DrawFoFrame(expr n, p) =
  drawoptions(withcolor FoLineColor[n] withpen pencircle scaled FoLineWidth[n]) ;
  if     FoLineStyle[n] = FoNone   :
    % nothing
  elseif FoLineStyle[n] = FoHidden :
    % nothing
  elseif FoLineStyle[n] = FoDotted :
    draw p dashed (withdots scaled (FoDotFactor*FoLineWidth[n])) ;
  elseif FoLineStyle[n] = FoDashed :
    draw p dashed (evenly scaled (FoDashFactor*FoLineWidth[n])) ;
  elseif FoLineStyle[n] = FoSolid  :
    draw p ;
  elseif FoLineStyle[n] = FoDouble :
    draw p enlarged  FoLineWidth[n] ; draw p enlarged -FoLineWidth[n] ;
  elseif FoLineStyle[n] = FoGroove :
    draw p ;
    draw p withpen pencircle scaled .5FoLineWidth[n] withcolor (inverted FoLineColor[n] softened .5) ;
  elseif FoLineStyle[n] = FoRidge  :
    draw p withcolor  (inverted FoLineColor[n] softened .5) ;
    draw p withpen pencircle scaled .5FoLineWidth[n] ;
  elseif FoLineStyle[n] = FoInset  :
    draw p ; draw p inset 2.5FoLineWidth[n] ;
  elseif FoLineStyle[n] = FoOutset :
    draw p ; draw p outset 2.5FoLineWidth[n] ;
 fi ;
enddef ;

primarydef p outset d =
  ((lrcorner p -- urcorner p -- ulcorner p -- llcorner p -- cycle)
      shifted (d*(-1,1)) cutbefore topboundary p) cutafter leftboundary p
enddef ;

primarydef p inset d =
  ((ulcorner p -- llcorner p -- lrcorner p -- urcorner p -- cycle)
      shifted (d*(1,-1)) cutbefore bottomboundary p) cutafter rightboundary p
enddef ;

vardef equalpaths(expr p, q) =
  if length(p) = length(q) :
    save ok ; boolean ok ; ok := true ;
    for i = 0 upto length(p)-1 :
      ok := ok and (round(point i of p) = round(point i of q)) ;
    endfor ;
    ok
  else :
    false
  fi
enddef ;

endinput ;
