Patch title: Release 81 bulk changes
Abstract:
File: /pliant/graphic/color/adjust.pli
Key:
    Removed line
    Added line
module "/pliant/math/functions.pli"
module "spectrum.pli"
module "color.pli"
module "database.pli"


constant h 6.6262e-34
constant c 2.99792458e8
constant k 1.3807e-23

function planck_law t w -> e
  arg Float t w e
  e := (2*h*c^2)/w^5/((exp h*c/w/k/t)-1)

function planckian_radiator t -> s
  arg Float t ; arg ColorSpectrum s
  s set_step 10
  for (var Int i) 380 780 step 10
    s set_measure i (planck_law t i*1e-9)


function color_adjust xyz options
  arg_rw ColorXYZ xyz ; arg Str options
  var ColorXYZn xyzn := cast xyz ColorXYZn
  xyzn X := exposure xyzn:X 0.25
  xyzn Y := exposure xyzn:Y 0.25
  xyzn Z := exposure xyzn:Z 0.25
  var Float saturation := options option "saturation" Float
  var Float saturation
  if ((options (options option_position "saturation" options:len) options:len) parse word:"saturation" (var Float saturation0) (var Float saturation1) any)
    saturation := (1-xyz:Y)*saturation0+xyz:Y*saturation1
  else
    saturation := options option "saturation" Float
  if saturation=defined
    xyzn X := xyzn:X*(1+saturation)-saturation*xyzn:Y
    xyzn Z := xyzn:Z*(1+saturation)-saturation*xyzn:Y
  var ColorSpectrum32 s := cast 1 ColorSpectrum32 ; var CBool modified := false
  var ColorSpectrum32 so := cast 1 ColorSpectrum32
  var Float temperature := options option "temperature" Float
  if temperature=defined
    var ColorSpectrum32 s1 := planckian_radiator (options option "reference_temperature" Float 5000)
    var ColorSpectrum32 s2 := planckian_radiator temperature
    s *= s2/s1 ; modified := true
  var Float orthogonal := options option "orthogonal" Float
  if orthogonal=defined
    var ColorSpectrum32 s1 := planckian_radiator (options option "reference_temperature" Float 5000)
    var ColorSpectrum32 s2 := planckian_radiator orthogonal
    so *= s2/s1 ; modified := true
  for (var Int i) 0 3
    var Str color := shunt i=0 "cyan" i=1 "magenta" i=2 "yellow" "black"
    var Float extra := options option "grey_"+color Float
    if extra=defined
      var Data:ColorChannel primary :> color_database:data:device:"default":channel:color
      s *= (primary:s100/primary:s0)^extra ; modified := true
  if modified
    var ColorXYZn filter := cast filter_XYZ:s ColorXYZn
    var ColorXYZn filtero := cast filter_XYZ:so ColorXYZn
    xyzn X := exposure xyzn:X (filter:X/filter:Y-1)/2-(filtero:Z/filtero:Y-1)/2
    xyzn Z := exposure xyzn:Z (filter:Z/filter:Y-1)/2+(filtero:X/filtero:Y-1)/2
  var Float exposure := options option "exposure" Float
  if exposure=defined
    xyzn X := exposure xyzn:X exposure
    xyzn Y := exposure xyzn:Y exposure
    xyzn Z := exposure xyzn:Z exposure
  var Float contrast := options option "contrast" Float
  if contrast=defined
    xyzn X := contrast xyzn:X contrast
    xyzn Y := contrast xyzn:Y contrast
    xyzn Z := contrast xyzn:Z contrast
  var Float exposure := options option "exposure" Float
  if exposure=defined
    xyzn X := exposure xyzn:X exposure
    xyzn Y := exposure xyzn:Y exposure
    xyzn Z := exposure xyzn:Z exposure
  var Float dark := options option "dark" Float
  if dark=defined
    var Float f := xyzn:X ^ (1+dark) ; if f=defined { xyzn X := f }
    var Float f := xyzn:Y ^ (1+dark) ; if f=defined { xyzn Y := f }
    var Float f := xyzn:Z ^ (1+dark) ; if f=defined { xyzn Z := f }
  var Float light := options option "light" Float
  if light=defined
    var Float f := (1-xyzn:X) ^ (1+light) ; if f=defined { xyzn X := 1-f }
    var Float f := (1-xyzn:Y) ^ (1+light) ; if f=defined { xyzn Y := 1-f }
    var Float f := (1-xyzn:Z) ^ (1+light) ; if f=defined { xyzn Z := 1-f }
  xyzn X := unexposure xyzn:X 0.25
  xyzn Y := unexposure xyzn:Y 0.25
  xyzn Z := unexposure xyzn:Z 0.25
  var Float zero := options option "zero" Float
  if zero=defined
    var Float z := options option "zero_X" Float zero ; xyzn X := z+xyzn:X*(1-z)
    var Float z := options option "zero_Y" Float zero ; xyzn Y := z+xyzn:Y*(1-z)
    var Float z := options option "zero_Z" Float zero ; xyzn Z := z+xyzn:Z*(1-z)
  xyz := cast xyzn ColorXYZ

export color_adjust