Patch title: Release 81 bulk changes
Abstract:
File: /pliant/graphic/color/gradation.pli
Key:
    Removed line
    Added line
abstract
  [Efficients encoding/decoding handling accoding to gradation curve]


module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/math/curve.pli"
module "/pliant/graphic/misc/int.pli"

public
  constant encoded_resolution 256
  constant linear_resolution 4096

type ColorGradation
  field (Array Float32 encoded_resolution) decode_table
  field (Array uInt8 linear_resolution) encode_table
  field Int maximum
  field Status status <- failure

method cg compute
  arg_rw ColorGradation cg
  for (var Int i) 0 encoded_resolution-1
    if cg:decode_table:i=undefined
      cg status := failure
      return
  for (var Int i) 1 encoded_resolution-1
    if cg:decode_table:i<=cg:decode_table:(i-1) and cg:decode_table:i<0.99
      cg status := failure
      return
  var Int encoded := 0
  for (var Int i) 0 linear_resolution-1
    var Float linear := i/(linear_resolution-1)
    while encoded+1<encoded_resolution and (abs linear-cg:decode_table:(encoded+1))<(abs linear-cg:decode_table:encoded)
      encoded += 1
    cg:encode_table i := encoded
  cg maximum := encoded
  cg status := success

function color_gamma gamma threshold extra -> cg
  arg Float gamma threshold extra ; arg ColorGradation cg
  var Float factor := threshold/((threshold+extra)/(1+extra))^gamma
  for (var Int i) 0 encoded_resolution-1
    var Float e := i/(encoded_resolution-1)
    var Float l
    if e<threshold
      l := e/factor
    else
      l := ((e+extra)/(1+extra))^gamma
    if l=undefined
      l := 0
    cg:decode_table i := l
  cg compute
  
function color_gradation curve -> cg
  arg Curve curve ; arg ColorGradation cg
  # curve is level (0 - 255) -> density (0 - 1)
  if curve=failure
    cg status := failure
    return
  for (var Int i) 0 encoded_resolution-1
    cg:decode_table i := curve y i 1e-12
  cg compute


method cg decode level -> linear
  arg ColorGradation cg ; arg Int level ; arg Float linear
  linear := cg:decode_table level
  
method cg encode linear -> level
   arg ColorGradation cg ; arg Float linear ; arg Int level
   var Int assign := cast linear*(linear_resolution-1) Int
   level := cg:encode_table (bound assign 0 linear_resolution-1)


function 'cast Status' g -> status
  arg ColorGradation g ; arg Status status
  extension
  status := g status


export ColorGradation color_gamma color_gradation '. decode' '. encode' 'cast Status'
export '. decode_table' '. compute' '. maximum'