Patch title: Release 92 bulk changes
Abstract:
File: /graphic/image/rip.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/compiler/type/inherit.pli"
module "prototype.pli"
module "/pliant/graphic/color/gamut.pli"
module "pixmap.pli"
module "packed.pli"
module "/pliant/graphic/draw/displaylist.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/draw/image.pli"

constant default_rip_cache_size 4*2^20

type ImageRIP
  inherit ImagePrototype
  field Link:DrawDisplayList list
  field Link:DrawPrototype list
  field Link:Type draw_image_type
  field Str options
  field Link:ImagePrototype cache
  field Int base_y


method rip bind list options -> status
  oarg_rw ImageRIP rip ; oarg DrawDisplayList list ; arg Str options ; arg ExtendedStatus status
  addressof:rip map ImagePrototype := image_prototype list:image_prototype options+" "+list:options
  oarg_rw ImageRIP rip ; oarg DrawPrototype list ; arg Str options ; arg ExtendedStatus status
  var ImagePrototype proto := list image_prototype options
  addressof:rip map ImagePrototype := image_prototype proto options+(shunt options<>"" and proto:options<>"" " " "")+proto:options
  if rip:size_x<1 or rip:size_y<1
    return (failure "Incorrect "+(string rip:size_x)+" x "+(string rip:size_y)+" image size")
  rip list :> list
  rip options := options
  rip base_y := undefined
  if (options option "packed")
    rip cache :> new ImagePacked
  else
    rip cache :> new ImagePixmap
  var Int step := options option "step" Int rip:size_y
  var Int cache := options option "cache" Int default_rip_cache_size
  if cache=defined
    step := max (min step cache\rip:line_size) 1
  rip:cache setup (image_prototype 0 0 1 1 rip:size_x (min step rip:size_y) rip:gamut) options
  status := success

method rip read x y count adr
  oarg_rw ImageRIP rip ; arg Int x y count ; arg Address adr
  implicit rip
    if y<base_y or y>=base_y+cache:size_y
      base_y := min y size_y-cache:size_y
      var Float unit_y := (y1-y0)/size_y
      cache := image_prototype x0 y0+base_y*unit_y x1 y0+(base_y+cache:size_y)*unit_y size_x cache:size_y gamut
      var ColorBuffer pixel ; memory_clear addressof:pixel pixel_size
      if gamut:model=color_gamut_additive
        addressof:pixel map Int := -1
      for (var Int iy) 0 cache:size_y-1
        cache fill 0 iy size_x addressof:pixel
      var Link:DrawImage draw :> new DrawImage
      if (exists rip:draw_image_type)
        draw image_type :> rip draw_image_type
      draw bind cache rip:options
      list replay draw rip:options
      var ImagePrototype proto := list image_prototype rip:options
      draw setup proto rip:options+(shunt rip:options<>"" and proto:options<>"" " " "")+proto:options
      list play draw rip:options
    cache read x y-base_y count adr

method rip read_map x y mini maxi count -> adr
  oarg_rw ImageRIP rip ; arg Int x y mini maxi ; arg_w Int count ; arg Address adr
  if y>=rip:base_y and y<rip:base_y+rip:cache:size_y
    adr := rip:cache read_map x y+rip:base_y mini maxi count
    adr := rip:cache read_map x y-rip:base_y mini maxi count
  else
    count := 0 ; adr := null

method rip read_unmap x y count adr
  oarg_rw ImageRIP rip ; arg Int x y count ; arg Address adr
  rip:cache read_unmap x y+rip:base_y count adr

method rip write_map x y mini maxi count -> adr
  oarg_rw ImageRIP rip ; arg Int x y mini maxi ; arg_w Int count ; arg Address adr
  if y>=rip:base_y and y<rip:base_y+rip:cache:size_y
    adr := rip:cache write_map x y+rip:base_y mini maxi count
  else
    count := 0 ; adr := null

method rip write_unmap x y count adr
  oarg_rw ImageRIP rip ; arg Int x y count ; arg Address adr
  rip:cache write_unmap x y+rip:base_y count adr

export ImageRIP '. bind' '. read'
export ImageRIP '. bind' '. read' '. draw_image_type'