Patch title: Release 96 bulk changes
Abstract:
File: /pliant/graphic/layout/helper/draw.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/math/curve.pli"
module "/pliant/graphic/layout/prototype.pli"


method d rectangle x0 y0 x1 y1 round thickness color
  oarg_rw DrawPrototype d ; arg Float x0 y0 x1 y1 ; arg Float round thickness ; arg Address color
  (var Array:Curve curves) size := shunt thickness=defined 2 1
  var Pointer:Curve c :> curves 0 ; var CurvePoint p
  p := curve_point x0+round y0 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
  p := curve_point x1-round y0 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
  p := curve_point x1 y0+round false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
  p := curve_point x1 y1-round false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
  p := curve_point x1-round y1 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
  p := curve_point x0+round y1 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
  p := curve_point x0 y1-round false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
  p := curve_point x0 y0+round false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
constant epsilon 1e-6

function rounded_rectangle x0 y0 x1 y1 round c
  arg Float x0 y0 x1 y1 round ; arg_w Curve c
  var Float r := min round (min x1-x0 y1-y0)/2-epsilon
  var CurvePoint p
  if r>0
    p := curve_point x0+r y0 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1-r y0 false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1 y0+r false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1 y1-r false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1-r y1 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0+r y1 false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0 y1-r false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
    p := curve_point x0 y0+r false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
  else
    c angle x0 y0
    c angle x1 y0
    c angle x1 y1
    c angle x0 y1
  c compute outline
  if thickness=defined
    var Pointer:Curve c :> curves 1
    p := curve_point x0+round y0+thickness false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1-round y0+thickness false ; p tg_in -1 0 ; p tg_out 1 0 ; c += p
    p := curve_point x1-thickness y0+round false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1-thickness y1-round false ; p tg_in 0 -1 ; p tg_out 0 1 ; c += p
    p := curve_point x1-round y1-thickness false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0+round y1-thickness false ; p tg_in 1 0 ; p tg_out -1 0 ; c += p
    p := curve_point x0+thickness y1-round false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
    p := curve_point x0+thickness y0+round false ; p tg_in 0 1 ; p tg_out 0 -1 ; c += p
    c compute outline

method d rectangle x0 y0 x1 y1 round color
  oarg_rw DrawPrototype d ; arg Float x0 y0 x1 y1 ; arg Float round ; arg Address color
  (var Array:Curve curves) size := 1
  rounded_rectangle x0 y0 x1 y1 round curves:0
  d fill curves fill_evenodd transform color

method d border x0a y0a x1a y1a rounda x0b y0b x1b y1b roundb color
  oarg_rw DrawPrototype d ; arg Float x0a y0a x1a y1a rounda x0b y0b x1b y1b roundb ; arg Address color
  (var Array:Curve curves) size := 2
  rounded_rectangle x0a y0a x1a y1a rounda curves:0
  rounded_rectangle x0b y0b x1b y1b roundb curves:1
  d fill curves fill_evenodd transform color

export '. rectangle'

function box_draw x0 y0 x1 y1 s d c
  arg Float x0 y0 x1 y1 ; arg LayoutStyleBox s ; oarg_rw DrawPrototype d ;  arg_rw LayoutDC c
  var Int mode := s:mode .and. 0FFh
  if mode=0
    void
  eif mode=1
    if (exists s:r1:color:gamut)
      d rectangle x0+s:r1:x0 y0+s:r1:y0 x1-s:r1:x1 y1-s:r1:y1 s:r1:round (c color s:r1:color)
  eif mode=2
    if (exists s:r1:color:gamut)
      if (exists s:r2:color:gamut)
        d rectangle x0+s:r1:x0 y0+s:r1:y0 x1-s:r1:x1 y1-s:r1:y1 s:r1:round (c color s:r1:color)
        d rectangle x0+s:r2:x0 y0+s:r2:y0 x1-s:r2:x1 y1-s:r2:y1 s:r2:round (c color s:r2:color)
      else
        d border x0+s:r1:x0 y0+s:r1:y0 x1-s:r1:x1 y1-s:r1:y1 s:r1:round x0+s:r2:x0 y0+s:r2:y0 x1-s:r2:x1 y1-s:r2:y1 s:r2:round (c color s:r1:color)


export box_draw