Patch title: Release 90 bulk changes
Abstract:
File: /graphic/vector/stroke.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/math/point.pli"
module "/pliant/math/vector.pli"
module "/pliant/math/curve.pli"
module "/pliant/math/transform.pli"
module "/pliant/graphic/draw/prototype.pli"


function '+' p1 v -> p2
  arg Point2 p1 ; arg Vector2 v ; arg Point2 p2
  p2 x := p1:x+v:x
  p2 y := p1:y+v:y

function '-' p1 p2 -> v
  arg Point2 p1 p2 ; arg Vector2 v
  v x := p1:x-p2:x
  v y := p1:y-p2:y

function '*' c v -> w
  arg Float c ; arg Vector2 v w
  w x := c*v:x
  w y := c*v:y

function norme v -> d
  arg Vector2 v ; arg Float d
  d := ( v:x*v:x + v:y*v:y )^0.5
  if d=undefined
    d := 0

function orthogonal v -> w
  arg Vector2 v w
  w x := -(v y)
  w y := v x

function resize v d -> w
  arg Vector2 v ; arg Float d ; arg Vector2 w
  w := (d/norme:v)*v

function intersection a b c d -> i
  arg Point2 a b c d i
  var Float m := a:y-b:y      # we have to solve (m n) * (X) = (x)
  var Float n := b:x-a:x      #                  (o p)   (Y)   (y)
  var Float o := c:y-d:y
  var Float p := d:x-c:x
  var Float det := m*p-o*n
  var Float x := a:x*m+a:y*n
  var Float y := c:x*o+c:y*p
  i x := (p*x-n*y)/det
  i y := (m*y-o*x)/det 


function '+=' c p
  arg_rw Curve c ; arg Point2 p
  c angle p:x p:y

function corner p0 p1 p2 width line
  arg Point2 p0 p1 p2 ; arg Float width ; arg_rw Curve line
  var Vector2 o01 := resize (orthogonal p1-p0) width/2
  var Vector2 o12 := resize (orthogonal p2-p1) width/2
  var Point2 q0 := p0+o01
  var Point2 q1 := p1+o01
  var Point2 q2 := p1+o12
  var Point2 q3 := p2+o12
  var Point2 inter := intersection q0 q1 q2 q3
  if inter:x=undefined or inter:y=undefined
    line += q1
    line += q2
  eif (norme inter-q1)>width or (norme inter-q2)>width
    line += q1+(resize inter-q1 width)
    line += q2+(resize inter-q2 width)
  else
    line += inter

function line curve width -> line
  arg Curve curve ; arg Float width ; arg Curve line
  var Float epsilon := 1e-3
  var Array:Point2 points := curve polyline transform epsilon
  var Int j := 1
  while j<points:size
    if (norme (points j)-(points j-1))<epsilon/10
      for (var Int k) j points:size-2
        points k := points k+1
      points size -= 1
    else
      j += 1
  line reset
  line += points:0+(resize (orthogonal points:1-points:0) width/2)
  for (var Int j) 0 points:size-3
    corner (points j) (points j+1) (points j+2) width line
  line += (points points:size-1)+(resize (orthogonal (points points:size-1)-(points points:size-2)) width/2)
  line += (points points:size-1)+(resize (orthogonal (points points:size-2)-(points points:size-1)) width/2)
  for (var Int j) points:size-1 2 step -1
    corner (points j) (points j-1) (points j-2) width line
  line += points:0+(resize (orthogonal points:0-points:1) width/2)
  line compute outline


method d stroke curves width options t color
  oarg_rw DrawPrototype d ; arg Array:Curve curves ; arg Float width ; arg Str options ; arg Transform2 t ; arg Address color
  for (var Int i) 0 curves:size-1
    if curves:i=success
      (var Array:Curve stroke) size := 1
      stroke 0 := line curves:i width
      d fill stroke fill_nonzero t color


export '. stroke'