Patch title: Release 81 bulk changes
Abstract:
File: /pliant/graphic/color/ink.pli
Key:
    Removed line
    Added line
   
abstract
  [Inks simulation]



function color_ink name options -> ink
  arg Str name options ; arg Link:ColorInk ink
  if not (name parse any:(var Str device_id) ":" any:(var St
    device_id := "default" ; channel_id := name
  var Data:ColorChannel channel :> color_database:data:devic
  if not exists:channel and (exists color_database:data:devi
    var Str alias := color_database:data:device:device_id:al
    channel :> color_database:data:device:device_id:channel:
  if channel:s0=undefined or channel:s100=undefined
    ink :> new ColorInk
    return
  var Str opt := options+" "+channel:options+" "+color_datab
  sem request
  var Pointer:Arrow c :> colors first string:name+" "+string
  if c<>null
    ink :> c map ColorInk
    sem release
    return
  if colors:count>=ink_cache
    colors := var Dictionary empty_dictionary
  ink :> new ColorInk
  ink s0 := adjust channel:s0 opt false
  ink s50 := adjust channel:s50 opt false
  ink s100 := adjust channel:s100 opt true
  ink specular := opt option "specular" Float 0
  ink opacity := opt option "opacity" Float default_opacity
  ink maximum := opt option "maximum" Int 255
  var CBool negative := opt option "negative"
abstract
  [Inks simulation]



function color_ink name options -> ink
  arg Str name options ; arg Link:ColorInk ink
  if not (name parse any:(var Str device_id) ":" any:(var St
    device_id := "default" ; channel_id := name
  var Data:ColorChannel channel :> color_database:data:devic
  if not exists:channel and (exists color_database:data:devi
    var Str alias := color_database:data:device:device_id:al
    channel :> color_database:data:device:device_id:channel:
  if channel:s0=undefined or channel:s100=undefined
    ink :> new ColorInk
    return
  var Str opt := options+" "+channel:options+" "+color_datab
  sem request
  var Pointer:Arrow c :> colors first string:name+" "+string
  if c<>null
    ink :> c map ColorInk
    sem release
    return
  if colors:count>=ink_cache
    colors := var Dictionary empty_dictionary
  ink :> new ColorInk
  ink s0 := adjust channel:s0 opt false
  ink s50 := adjust channel:s50 opt false
  ink s100 := adjust channel:s100 opt true
  ink specular := opt option "specular" Float 0
  ink opacity := opt option "opacity" Float default_opacity
  ink maximum := opt option "maximum" Int 255
  var CBool negative := opt option "negative"
  var CBool linear := opt option "linear"
  ink darkness := opt option "darkness" Float (shunt negativ
  ink smudge := opt option "smudge" Float 0
  ink options := opt
  var (Index Int ColorSpectrum32) samples
  each sample channel:sample
    if (keyof:sample parse (var Int index))
      samples insert index (adjust color_spectrum32:sample o
  var Int maxi := shunt (exists channel:sample:"255") 255 10
  var Float dot := opt option "dot" Float 0
  for (var Int l) 0 encoded_resolution-1
  ink darkness := opt option "darkness" Float (shunt negativ
  ink smudge := opt option "smudge" Float 0
  ink options := opt
  var (Index Int ColorSpectrum32) samples
  each sample channel:sample
    if (keyof:sample parse (var Int index))
      samples insert index (adjust color_spectrum32:sample o
  var Int maxi := shunt (exists channel:sample:"255") 255 10
  var Float dot := opt option "dot" Float 0
  for (var Int l) 0 encoded_resolution-1
    var Float d := ink_dot_growth (shunt negative encoded_re
    var Float d := ink_dot_growth (shunt negative encoded_resolution-1-l l)/(encoded_resolution-1) (shunt samples:size=2 dot 0)
    var ColorSpectrum32 s
    if samples:size=3 and ink:s50<>undefined
      s := ink_surface_simulation d ink:s0 ink:s50 ink:s100
    var ColorSpectrum32 s
    if samples:size=3 and ink:s50<>undefined
      s := ink_surface_simulation d ink:s0 ink:s50 ink:s100
      ink:gradation:decode_table l := shunt negative 1-d d
    eif samples:size=2 # we have only 0 and 100% so we assum
      s := ink_surface_simulation d ink:s0 ink:s100
    eif samples:size=2 # we have only 0 and 100% so we assum
      s := ink_surface_simulation d ink:s0 ink:s100
      ink:gradation:decode_table l := shunt negative 1-d d
    else # we have more than three values, so we assume inkj
      var Pointer:ColorSpectrum32 a :> samples first
      var Pointer:ColorSpectrum32 b :> samples next a
      while (samples key b)<d*maxi
        a :> b ; b :> samples next a
      s := unexposure (ink_linear_simulation (d*maxi-(sample
    else # we have more than three values, so we assume inkj
      var Pointer:ColorSpectrum32 a :> samples first
      var Pointer:ColorSpectrum32 b :> samples next a
      while (samples key b)<d*maxi
        a :> b ; b :> samples next a
      s := unexposure (ink_linear_simulation (d*maxi-(sample
      ink:gradation:decode_table l := ink_surface s ink:s0 i
      if not linear
        d := ink_surface s ink:s0 ink:s100
    ink:gradation:decode_table l := shunt negative 1-d d
    ink:filter l := s/ink:s0
    var Pointer:ColorInkFastFilter p :> ink:fast_filter l
    var ColorRGB rgb := cast (filter_XYZ ink:filter:l) Color
    rgb r := bound rgb:r 0 1
    rgb g := bound rgb:g 0 1
    rgb b := bound rgb:b 0 1
    var Float o := l/(encoded_resolution-1)*ink:opacity
    p r_filter := (1-o)*rgb:r ; p r_generator := o*rgb:r
    p g_filter := (1-o)*rgb:g ; p g_generator := o*rgb:g
    p b_filter := (1-o)*rgb:b ; p b_generator := o*rgb:b
  ink status := success
  ink:gradation compute
  if ink:gradation=failure
    ink status := failure
  colors insert string:name+" "+string:opt true addressof:in
  sem release



export migrate
    ink:filter l := s/ink:s0
    var Pointer:ColorInkFastFilter p :> ink:fast_filter l
    var ColorRGB rgb := cast (filter_XYZ ink:filter:l) Color
    rgb r := bound rgb:r 0 1
    rgb g := bound rgb:g 0 1
    rgb b := bound rgb:b 0 1
    var Float o := l/(encoded_resolution-1)*ink:opacity
    p r_filter := (1-o)*rgb:r ; p r_generator := o*rgb:r
    p g_filter := (1-o)*rgb:g ; p g_generator := o*rgb:g
    p b_filter := (1-o)*rgb:b ; p b_generator := o*rgb:b
  ink status := success
  ink:gradation compute
  if ink:gradation=failure
    ink status := failure
  colors insert string:name+" "+string:opt true addressof:in
  sem release



export migrate