Patch title: Release 90 bulk changes
Abstract:
File: /graphic/vector/outline.pli
Key:
    Removed line
    Added line
   
abstract
  [Filling an outline (Pliant formula or Bezier)]


abstract
  [Filling an outline (Pliant formula or Bezier)]



public
  constant outline_evenodd 0 # odd even
  constant outline_nonzero 1 # non zero



public
  constant outline_evenodd 0 # odd even
  constant outline_nonzero 1 # non zero



method p index_x x -> i
  arg ImagePrototype p ; arg Float x ; arg Int i
  i := cast (x-p:x0)/(p:x1-p:x0)*p:size_x Int
method p index_x x delta -> i
  arg ImagePrototype p ; arg Float x delta ; arg Int i
  i := cast (x-p:x0)/(p:x1-p:x0)*p:size_x+delta Int


method p index_y y -> i
  arg ImagePrototype p ; arg Float y ; arg Int i
  i := cast (y-p:y0)/(p:y1-p:y0)*p:size_y Int
method p index_y y delta -> i
  arg ImagePrototype p ; arg Float y delta ; arg Int i
  i := cast (y-p:y0)/(p:y1-p:y0)*p:size_y+delta Int

method img fill outline mode color
  oarg_rw ImagePrototype img ; arg_rw Outline outline ; arg 
  outline bbox (var Float min_x) (var Float min_y) (var Floa
  if min_x=undefined
    return

method img fill outline mode color
  oarg_rw ImagePrototype img ; arg_rw Outline outline ; arg 
  outline bbox (var Float min_x) (var Float min_y) (var Floa
  if min_x=undefined
    return
  var Int min_iy := max (img index_y min_y) 0
  var Int max_iy := (min (img index_y max_y) img:size_y)-1
  if outline:chains:size=0
  var Int iy0 := img index_y min_y -0.499
  var Int iy1 := (img index_y max_y -0.499)+1
  img clip (var Int ix0) iy0 (var Int ix1) iy1
  if outline:chains:size=0 or iy1<=iy0
    return
  quick_sort_chains (addressof outline:chains:0) outline:cha
  var Int n0 := 0 ; var Int n1 := 0
    return
  quick_sort_chains (addressof outline:chains:0) outline:cha
  var Int n0 := 0 ; var Int n1 := 0
  for (var Int iy) min_iy max_iy
  for (var Int iy) iy0 iy1-1
    var Float y := img:y0+(iy+0.5)/img:size_y*(img:y1-img:y0
    # add new active chains
    while n1<outline:chains:size and outline:chains:n1:point
      outline:chains:n1:current := 0
      n1 += 1
    # forward active chains and drop terminated chains
    for (var Int i) n0 n1-1
      var Pointer:OutlineChain chain :> outline:chains:i
      part forward
        while (chain:points chain:current+1):y<=y
          if chain:current+2<chain:points:size
            chain current += 1
          else
            if i<>n0
              swap outline:chains:i outline:chains:n0
            n0 += 1
            leave forward
    # compute horizontal positions
    for (var Int i) n0 n1-1
      var Pointer:OutlineChain chain :> outline:chains:i
      var Pointer:Point2 p0 :> chain:points chain:current
      var Pointer:Point2 p1 :> chain:points chain:current+1
      chain x := p0:x+(p1:x-p0:x)*(y-p0:y)/(p1:y-p0:y)
    # sort active chains from left to right
    for (var Int i) n0+1 n1-1
      var Int j := i
      while j>n0 and outline:chains:j:x<outline:chains:(j-1)
        swap outline:chains:j outline:chains:(j-1)
        j -= 1
    # draw
    check (n1-n0)%2=0
    if mode=outline_evenodd
      for (var Int i) n0 n1-2 step 2
    var Float y := img:y0+(iy+0.5)/img:size_y*(img:y1-img:y0
    # add new active chains
    while n1<outline:chains:size and outline:chains:n1:point
      outline:chains:n1:current := 0
      n1 += 1
    # forward active chains and drop terminated chains
    for (var Int i) n0 n1-1
      var Pointer:OutlineChain chain :> outline:chains:i
      part forward
        while (chain:points chain:current+1):y<=y
          if chain:current+2<chain:points:size
            chain current += 1
          else
            if i<>n0
              swap outline:chains:i outline:chains:n0
            n0 += 1
            leave forward
    # compute horizontal positions
    for (var Int i) n0 n1-1
      var Pointer:OutlineChain chain :> outline:chains:i
      var Pointer:Point2 p0 :> chain:points chain:current
      var Pointer:Point2 p1 :> chain:points chain:current+1
      chain x := p0:x+(p1:x-p0:x)*(y-p0:y)/(p1:y-p0:y)
    # sort active chains from left to right
    for (var Int i) n0+1 n1-1
      var Int j := i
      while j>n0 and outline:chains:j:x<outline:chains:(j-1)
        swap outline:chains:j outline:chains:(j-1)
        j -= 1
    # draw
    check (n1-n0)%2=0
    if mode=outline_evenodd
      for (var Int i) n0 n1-2 step 2
        var Int seg_x0 := max (img index_x outline:chains:i:
        var Int seg_x1 := min (img index_x outline:chains:(i
        var Int seg_x0 := max (img index_x outline:chains:i:x 0) 0
        var Int seg_x1 := min (img index_x outline:chains:(i+1):x 0) img:size_x
        if seg_x1>seg_x0
          img fill seg_x0 iy seg_x1-seg_x0 color
    eif mode=outline_nonzero
      var Int count := 0
      for (var Int i) n0 n1-2
        count += outline:chains:i:way
        if count<>0
        if seg_x1>seg_x0
          img fill seg_x0 iy seg_x1-seg_x0 color
    eif mode=outline_nonzero
      var Int count := 0
      for (var Int i) n0 n1-2
        count += outline:chains:i:way
        if count<>0
          var Int seg_x0 := max (img index_x outline:chains:
          var Int seg_x1 := min (img index_x outline:chains:
          var Int seg_x0 := max (img index_x outline:chains:i:x 0) 0
          var Int seg_x1 := min (img index_x outline:chains:(i+1):x 0) img:size_x
          if seg_x1>seg_x0
            img fill seg_x0 iy seg_x1-seg_x0 color


          if seg_x1>seg_x0
            img fill seg_x0 iy seg_x1-seg_x0 color


if false

  type BoundingBox
    field Float x0 y0 x1 y1
  
  method b reset p
    arg_w BoundingBox b ; arg Point2 p
    b x0 := p x
    b y0 := p y
    b x1 := p x
    b y1 := p y
  
  method b include p
    arg_rw BoundingBox b ; arg Point2 p
    b x0 := min b:x0 p:x
    b y0 := min b:y0 p:y
    b x1 := max b:x1 p:x
    b y1 := max b:y1 p:y
  

method img fill curves mode t color
  oarg_rw ImagePrototype img ; arg Array:Curve curves ; arg 
method img fill curves mode t color
  oarg_rw ImagePrototype img ; arg Array:Curve curves ; arg 
  var Float epsilon := (min (img:x1-img:x0)/img:size_x (img:
  var Float epsilon := (min (abs img:x1-img:x0)/img:size_x (abs img:y1-img:y0)/img:size_y)/4
  var Outline outline
  for (var Int i) 0 curves:size-1
    var Array:Point2 pts := curves:i polyline t epsilon
    outline build_chains pts
  var Outline outline
  for (var Int i) 0 curves:size-1
    var Array:Point2 pts := curves:i polyline t epsilon
    outline build_chains pts
  # outline chains # FIXME: Pliant will wrongly optimize if 
  img fill outline mode color


method img rectangle x0 y0 x1 y1 color
  oarg_rw ImagePrototype img ; arg Float x0 y0 x1 y1 ; arg A
  img fill outline mode color


method img rectangle x0 y0 x1 y1 color
  oarg_rw ImagePrototype img ; arg Float x0 y0 x1 y1 ; arg A
  var Int ix0 := max (img index_x x0) 0
  var Int iy0 := max (img index_y y0) 0
  var Int ix1 := min (img index_x x1)+1 img:size_x
  var Int iy1 := min (img index_y y1)+1 img:size_y
  var Int ix0 := max (img index_x x0 0) 0
  var Int iy0 := max (img index_y y0 0) 0
  var Int ix1 := min (img index_x x1 0) img:size_x
  var Int iy1 := min (img index_y y1 0) img:size_y
  if ix1>ix0
    for (var Int iy) iy0 iy1-1
      img fill ix0 iy ix1-ix0 color



  if ix1>ix0
    for (var Int iy) iy0 iy1-1
      img fill ix0 iy ix1-ix0 color