Patch title: Release 87 bulk changes
Abstract:
File: /pliant/graphic/image/resampling.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
submodule "prototype.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "/pliant/graphic/misc/int.pli"
module "/pliant/graphic/misc/mtbuffer.pli"



method r bind image x0 y0 x1 y1 size_x size_y tx ty -> statu
  arg_rw ImageResampling r ; arg ImagePrototype image ; arg 
  addressof:r map ImagePrototype := addressof:image map Imag
  r x0 := x0 ; r y0 := y0 ; r x1 := x1 ; r y1 := y1
  r size_x := size_x ; r size_y := size_y
  r image :> image
  r translate_x := tx ; r translate_y := ty
  r map_pixel 0 0 r:delta_x r:delta_y
  r map_pixel 1 1 r:step_x r:step_y ; r step_x -= r delta_x 
  r same_resolution := (abs (x1-x0)/size_x-(image:x1-image:x
  r:xs size := r size_x ; r:offsets size := r size_x
  r start_x := 0 ; r stop_x := r:size_x
  for (var Int x) 0 r:size_x-1
    var Int ix := cast r:delta_x+x*r:step_x Int
    if ix<0
module "/pliant/language/compiler.pli"
submodule "prototype.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "/pliant/graphic/misc/int.pli"
module "/pliant/graphic/misc/mtbuffer.pli"



method r bind image x0 y0 x1 y1 size_x size_y tx ty -> statu
  arg_rw ImageResampling r ; arg ImagePrototype image ; arg 
  addressof:r map ImagePrototype := addressof:image map Imag
  r x0 := x0 ; r y0 := y0 ; r x1 := x1 ; r y1 := y1
  r size_x := size_x ; r size_y := size_y
  r image :> image
  r translate_x := tx ; r translate_y := ty
  r map_pixel 0 0 r:delta_x r:delta_y
  r map_pixel 1 1 r:step_x r:step_y ; r step_x -= r delta_x 
  r same_resolution := (abs (x1-x0)/size_x-(image:x1-image:x
  r:xs size := r size_x ; r:offsets size := r size_x
  r start_x := 0 ; r stop_x := r:size_x
  for (var Int x) 0 r:size_x-1
    var Int ix := cast r:delta_x+x*r:step_x Int
    if ix<0
      r start_x := x+1
      if r:step_x>=0
        r start_x := x+1
      else
        r stop_x := min x r:stop_x
    eif ix>=r:image:size_x
    eif ix>=r:image:size_x
      r stop_x := min x r:stop_x
      if r:step_x>=0
        r stop_x := min x r:stop_x
      else
        r start_x := x+1
    else
      r:xs x := ix ; r:offsets x := ix*image:pixel_size
  r:buffers size := image line_size
  status := success


method r read x y count adr
  arg_rw ImageResampling r ; arg Int x y count ; arg Address
  check x>=0 and count>=0 and x+count<=r:size_x and y>=0 and
  var Int iy := cast r:delta_y+y*r:step_y Int
  if iy<0 or iy>=r:image:size_y
    memory_clear adr count*r:pixel_size
  eif x<r:start_x
    var Int n := min r:start_x-x count
    memory_clear adr n*r:pixel_size
    if n<count
      r read x+n y count-n (adr translate Byte n*r:pixel_siz
  eif x+count>r:stop_x
    var Int n := min x+count-r:stop_x count
    memory_clear (adr translate Byte (count-n)*r:pixel_size)
    if n<count
      r read x y count-n adr
  else
    var Address buffer := r:buffers allocate
    var Int done := 0
    while done<count
      var Int ix0 := r:xs x+done
      var Int ix1 := (r:xs x+count-1)+1
    else
      r:xs x := ix ; r:offsets x := ix*image:pixel_size
  r:buffers size := image line_size
  status := success


method r read x y count adr
  arg_rw ImageResampling r ; arg Int x y count ; arg Address
  check x>=0 and count>=0 and x+count<=r:size_x and y>=0 and
  var Int iy := cast r:delta_y+y*r:step_y Int
  if iy<0 or iy>=r:image:size_y
    memory_clear adr count*r:pixel_size
  eif x<r:start_x
    var Int n := min r:start_x-x count
    memory_clear adr n*r:pixel_size
    if n<count
      r read x+n y count-n (adr translate Byte n*r:pixel_siz
  eif x+count>r:stop_x
    var Int n := min x+count-r:stop_x count
    memory_clear (adr translate Byte (count-n)*r:pixel_size)
    if n<count
      r read x y count-n adr
  else
    var Address buffer := r:buffers allocate
    var Int done := 0
    while done<count
      var Int ix0 := r:xs x+done
      var Int ix1 := (r:xs x+count-1)+1
      if ix1<ix0
        swap ix0 ix1
      var Address map := r:image read_map ix0 iy 1 ix1-ix0 (
      var Address buf ; var Int step
      if map<>null
        buf := map translate Byte -ix0*r:pixel_size
        if map_count=ix1-ix0
          step := count-done
        else
          var Int step := bound (cast ((ix0+map_count)-r:del
          while (r:xs x+done+step-1)>=ix0+map_count
            step -= 1
      else
        r:image read ix0 iy ix1-ix0 (buffer translate Byte i
        buf := buffer ; step := count-done
      if r:same_resolution
        memory_copy (buf translate Byte (r:offsets x+done)) 
      else
        var Address ptr := addressof (r:offsets x+done)
        var Address cur := adr translate Byte done*r:pixel_s
        while cur<>stop
          memory_copy (buf translate Byte (ptr map Int)) cur
          cur := cur translate Byte r:pixel_size
          ptr := ptr translate Int 1
      if map<>null
        r:image read_unmap ix0 iy map_count map
      done += step
    r:buffers free buffer



      var Address map := r:image read_map ix0 iy 1 ix1-ix0 (
      var Address buf ; var Int step
      if map<>null
        buf := map translate Byte -ix0*r:pixel_size
        if map_count=ix1-ix0
          step := count-done
        else
          var Int step := bound (cast ((ix0+map_count)-r:del
          while (r:xs x+done+step-1)>=ix0+map_count
            step -= 1
      else
        r:image read ix0 iy ix1-ix0 (buffer translate Byte i
        buf := buffer ; step := count-done
      if r:same_resolution
        memory_copy (buf translate Byte (r:offsets x+done)) 
      else
        var Address ptr := addressof (r:offsets x+done)
        var Address cur := adr translate Byte done*r:pixel_s
        while cur<>stop
          memory_copy (buf translate Byte (ptr map Int)) cur
          cur := cur translate Byte r:pixel_size
          ptr := ptr translate Int 1
      if map<>null
        r:image read_unmap ix0 iy map_count map
      done += step
    r:buffers free buffer