Patch title: Release 85 bulk changes
Abstract:
File: /pliant/graphic/image/transform.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "prototype.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "/pliant/math/point.pli"
module "/pliant/math/vector.pli"
module "/pliant/math/transform.pli"
module "/pliant/graphic/misc/transform.pli"


type ImageTransform
  inherit ImagePrototype
  field Link:ImagePrototype image
  field Point2 z ; field Vector2 vx vy

ImagePrototype maybe ImageTransform


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-0.499 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-0.499 Int

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

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

method t bind image trans target options -> status
  oarg_rw ImageTransform t ; oarg ImagePrototype image ; arg Transform2 trans ; arg ImagePrototype target ; arg Str options ; arg ExtendedStatus status
  t image :> image
  trans bbox image:x0 image:y0 image:x1 image:y1 (var Float tx0) (var Float ty0) (var Float tx1) (var Float ty1)
  var Int ix0 := max (target index_x tx0) 0
  var Int iy0 := max (target index_y ty0) 0
  var Int ix1 := min (target index_x tx1)+1 target:size_x
  var Int iy1 := min (target index_y ty1)+1 target:size_y
  addressof:t map ImagePrototype := image_prototype (target mm_x ix0) (target mm_x iy0) (target mm_x ix1) (target mm_x iy1) ix1-ix0 iy1-iy0 image:gamut
  var Transform2 d := compose (transform image:x0 image:y0 (image:x1-image:x0)/image:size_x (image:y1-image:y0)/image:size_y 0 0) trans (transform -(t x0)*t:size_x/(t:x1-t:x0) -(t y0)*t:size_y/(t:y1-t:y0) t:size_x/(t:x1-t:x0) t:size_y/(t:y1-t:y0) 0 0)
  var Transform2 r := reverse d
  t z := r (point 0 0)
  t vx := r (vector 1 0)
  t vy := r (vector 0 1)
  status := success

method t read x y count adr
  oarg_rw ImageTransform t ; arg Int x y count ; arg Address adr
  var Int psize := t pixel_size
  memory_clear adr count*psize
  var Int mx0 := 0 ; var Int mx1 := 0 ; var Int my ; var Address madr := null
  var Point2 p
  p x := t:z:x+x*t:vx:x+y*t:vy:x
  p y := t:z:y+x*t:vx:y+y*t:vy:y
  var Address a := adr ; var Address stop := adr translate Byte count*psize
  while a<>stop
    var Int ix := cast p:x Int
    var Int iy := cast p:y Int
    if iy=my and ix>=mx0 and ix<mx1
      memory_copy (madr translate Byte (ix-mx0)*psize) a psize
    eif iy>=0 and iy<t:image:size_y and ix>=0 and ix<t:image:size_x
      if madr<>null
        t:image read_unmap mx0 my mx1-mx0 madr
      mx0 := 0 ; my := iy ; madr := t:image read_map mx0 my ix+1 t:image:size_x (var Int mcount) ; mx1 := mx0+mcount
      if mx1<=ix
        if madr<>null
          t:image read_unmap mx0 my mx1-mx0 madr
        mx0 := ix ; my := iy ; madr := t:image read_map mx0 my 1 t:image:size_x-ix (var Int mcount) ; mx1 := mx0+mcount
        if madr=null
          error error_id_missing "Transform requires mapping capabilities"
          return
      memory_copy (madr translate Byte (ix-mx0)*psize) a psize
    p x += t:vx x ; p y += t:vx y ; a := a translate Byte psize
  if madr<>null
    t:image read_unmap mx0 my mx1-mx0 madr

export ImageTransform '. bind'