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


type ImageConvert
  inherit ImagePrototype
  field Link:ImagePrototype image
  field MtBuffer buffers
  field Arrow speedup
  field CBool same_gamut
  field Array:Float32 down
  field Array:Float32 up
  field Link:ColorGamut switch
  field Array:Int hachure

ImagePrototype maybe ImageConvert


method convert bind image gamut options -> status
  oarg_rw ImageConvert convert ; oarg ImagePrototype image ; oarg ColorGamut gamut ; arg Str options ; arg ExtendedStatus status
  if gamut=failure
    return (failure "Invalid gamut '"+gamut:name+"' ("+gamut:status:message+")")
  addressof:convert map ImagePrototype := addressof:image map ImagePrototype
  convert gamut :> gamut
  convert complete
  convert image :> image
  convert:buffers size := image line_size
  var Link:ColorGamut g :> image gamut
  if (exists convert:switch)
    g :> convert switch
  convert speedup := convert:gamut speedup g options
  convert speedup := gamut speedup g options
  convert same_gamut := image:gamut:name=gamut:name and (image:gamut query "options")=(gamut query "options")
  status := success

method convert setup image options -> status
  oarg_rw ImageConvert convert ; arg ImagePrototype image ; arg Str options ; arg ExtendedStatus status
  var Str gamut_name := options option "gamut" Str
  if gamut_name=""
    return failure:"Gamut name not specified"
  var Link:ColorGamut gamut :> color_gamut gamut_name
  if gamut=failure
    return (failure "Gamut '"+gamut_name+"' is not valid")
  status := convert bind (addressof:image omap ImagePrototype) gamut options


method convert read x y count adr
  oarg_rw ImageConvert convert ; arg Int x y count ; arg Address adr
  if convert:same_gamut and not (exists convert:switch) and convert:hachure:size=0 and convert:down:size=0
    convert:image read x y count adr
    return
  var Address buffer := convert:buffers allocate
  convert:image read x y count buffer
  var Link:ColorGamut g :> convert:image gamut
  if (exists convert:switch)
    g :> convert switch
  if convert:hachure:size>0
    var Int psize := convert:image pixel_size
    for (var Int d) 0 convert:hachure:size-1
      var Int h := convert:hachure d
      var Int z := shunt ((g query "component_options "+string:d) option "negative") 255 0
      if h=defined
        var Address ptr := buffer
        var Address stop := buffer translate Byte count*psize
        var Int r := (x+y)%(2*h)
        while ptr<>stop
          if r<h
            ptr map uInt8 d := z
          r += 1
          if r=2*h
            r := 0
          ptr := ptr translate Byte psize
  if convert:down:size>0
    var Int psize := convert:image pixel_size
    var Int dim := min (min convert:down:size convert:up:size) psize
    var Address downs := addressof convert:down:0
    var Address ups := addressof convert:up:0
    var Address ptr := buffer
    var Address stop := buffer translate Byte count*psize
    while ptr<>stop
      for (var Int i) 0 dim-1
        ptr map uInt8 i := cast (ptr map uInt8 i)*(downs map Float32 i)+255*(ups map Float32 i) Int
      ptr := ptr translate Byte psize
  convert:gamut convert g buffer adr count convert:speedup
  convert:buffers free buffer

export ImageConvert '. bind' '. down' '. up' '. switch' '. hachure'