Patch title: Release 92 bulk changes
Abstract:
File: /graphic/color/editor.page
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/graphic/misc/float.pli"
module "/pliant/admin/file.pli"
module "/pliant/protocol/http/uvar.pli"
module "/pliant/language/data/cache.pli"
module "database.pli"
module "spectrum.pli"
module "color.pli"
module "adjust.pli"
module "gradation.pli"
module "ink.pli"
module "gamut.pli"
module "spectro.pli"


if (options option "device") and (options option "channel")
  var Link:ImagePixmap img :> new ImagePixmap
  img setup (image_prototype 0 0 501 501 501 501 color_gamut
  var ColorRGB888 black ; black r := 0 ; black g := 0 ; blac
  var ColorRGB888 dark ; dark r := 40h ; dark g := 40h ; dar
  var ColorRGB888 middle ; middle r := 80h ; middle g := 80h
  var ColorRGB888 light ; light r := 0C0h ; light g := 0C0h 
  for (var Int i) 0 500
    img fill 0 i 501 addressof:light
  for (var Int i) 0 500 step 5
    for (var Int j) 0 500 step 5
      (img pixel i j) map ColorRGB888 := shunt i%50=0 or j%5
  for (var Int i) 0 2
    for (var Int j) 0 2
      for (var Int k) -2 2
        var Int xx := i*250+k
        var Int yy := j*250
        if xx>=0 and xx<=500 and yy>=0 and yy<=500
          (img pixel xx yy) map ColorRGB888 := black
        var Int xx := i*250
        var Int yy := j*250+k
        if xx>=0 and xx<=500 and yy>=0 and yy<=500
          (img pixel xx yy) map ColorRGB888 := black
module "/pliant/language/compiler.pli"
module "/pliant/graphic/misc/float.pli"
module "/pliant/admin/file.pli"
module "/pliant/protocol/http/uvar.pli"
module "/pliant/language/data/cache.pli"
module "database.pli"
module "spectrum.pli"
module "color.pli"
module "adjust.pli"
module "gradation.pli"
module "ink.pli"
module "gamut.pli"
module "spectro.pli"


if (options option "device") and (options option "channel")
  var Link:ImagePixmap img :> new ImagePixmap
  img setup (image_prototype 0 0 501 501 501 501 color_gamut
  var ColorRGB888 black ; black r := 0 ; black g := 0 ; blac
  var ColorRGB888 dark ; dark r := 40h ; dark g := 40h ; dar
  var ColorRGB888 middle ; middle r := 80h ; middle g := 80h
  var ColorRGB888 light ; light r := 0C0h ; light g := 0C0h 
  for (var Int i) 0 500
    img fill 0 i 501 addressof:light
  for (var Int i) 0 500 step 5
    for (var Int j) 0 500 step 5
      (img pixel i j) map ColorRGB888 := shunt i%50=0 or j%5
  for (var Int i) 0 2
    for (var Int j) 0 2
      for (var Int k) -2 2
        var Int xx := i*250+k
        var Int yy := j*250
        if xx>=0 and xx<=500 and yy>=0 and yy<=500
          (img pixel xx yy) map ColorRGB888 := black
        var Int xx := i*250
        var Int yy := j*250+k
        if xx>=0 and xx<=500 and yy>=0 and yy<=500
          (img pixel xx yy) map ColorRGB888 := black
  var Data:ColorChannel ch :> color_database:data:device:(op
  var ColorSpectrum32 z_s0 := ch s0
  var ColorSpectrum32 z_s100 := ch s100
  var Data:ColorDevice z_d :> color_database:data:device:(options option "device" Str)
  var Data:ColorChannel z_ch :> z_d:channel:(options option "channel" Str)
  var ColorSpectrum32 z_s0 := z_ch s0
  var ColorSpectrum32 z_s100 := z_ch s100
  if z_s0=undefined and z_s100=undefined
    return
  if z_s0=undefined and z_s100=undefined
    return
  var Float zero := z_ch:options+" "+z_d:options option "zero" Float 0
  var ColorSpectrum32 zz := cast zero ColorSpectrum32
  var Curve curve1 := var Curve empty_curve
  var Curve curve2 := var Curve empty_curve
  var Curve curve3 := var Curve empty_curve
  var Float range_x := 1
  var Float range_y := 1
  var Curve curve1 := var Curve empty_curve
  var Curve curve2 := var Curve empty_curve
  var Curve curve3 := var Curve empty_curve
  var Float range_x := 1
  var Float range_y := 1
  each sample ch:sample filter (keyof:sample parse (var Int 
  each sample z_ch:sample filter (keyof:sample parse (var Int i)) sort (right keyof:sample 9 " ")
    keyof:sample parse (var Float x)
    keyof:sample parse (var Float x)
    var Float y := ink_density color_spectrum32:sample z_s0 
    var Float y := ink_density color_spectrum32:sample-zz z_s0-zz z_s100-zz
    curve1 through x y
    curve1 through x y
    var Float y := ink_surface color_spectrum32:sample z_s0 
    var Float y := ink_surface color_spectrum32:sample-zz z_s0-zz z_s100-zz
    curve2 through x y
    curve2 through x y
    var Float y := ink_thickness color_spectrum32:sample z_s
    var Float y := ink_thickness color_spectrum32:sample-zz z_s0-zz z_s100-zz
    curve3 through x y
    range_x := max range_x x
    range_y := max range_y y
  curve1 compute y_from_x
  curve2 compute y_from_x
  curve3 compute y_from_x
  if curve3=success
    var ColorRGB888 blue ; blue r := 0 ; blue g := 0 ; blue 
    for (var Int i) 0 500
      var Float y := (curve3 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := blue
  if curve2=success
    var ColorRGB888 green ; green r := 0 ; green g := 255 ; 
    for (var Int i) 0 500
      var Float y := (curve2 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := green
  if curve1=success
    var ColorRGB888 red ; red r := 255 ; red g := 0 ; red b 
    for (var Int i) 0 500
      var Float y := (curve1 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := red
  reset_http_answer
  http_request send_header "mime [dq]image/png[dq]"
  img save http_request:answer_stream "filter [dq].png[dq]"
  http_request send_footer
  return
  
title "Color database editor"


    curve3 through x y
    range_x := max range_x x
    range_y := max range_y y
  curve1 compute y_from_x
  curve2 compute y_from_x
  curve3 compute y_from_x
  if curve3=success
    var ColorRGB888 blue ; blue r := 0 ; blue g := 0 ; blue 
    for (var Int i) 0 500
      var Float y := (curve3 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := blue
  if curve2=success
    var ColorRGB888 green ; green r := 0 ; green g := 255 ; 
    for (var Int i) 0 500
      var Float y := (curve2 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := green
  if curve1=success
    var ColorRGB888 red ; red r := 255 ; red g := 0 ; red b 
    for (var Int i) 0 500
      var Float y := (curve1 y i/500*range_x 1e-6)/range_y
      if y=defined
        var Int j := cast y*500 Int
        if j>=0 and j<=500
          (img pixel i 500-j) map ColorRGB888 := red
  reset_http_answer
  http_request send_header "mime [dq]image/png[dq]"
  img save http_request:answer_stream "filter [dq].png[dq]"
  http_request send_footer
  return
  
title "Color database editor"


page note "sample color conversion tool"
  title "Sample color conversion"
  input "Source gamut: " src_gamut_name length 80
  input "Source densities (in %): " densities length 40
  input "Destination gamut: " dest_gamut_name length 80
  button "Compute"
    reload_page
  para
    var Link:ColorGamut src_gamut :> color_gamut src_gamut_n
    var Link:ColorGamut dest_gamut :> color_gamut dest_gamut
    if src_gamut=success and dest_gamut=success
      var ColorBuffer pixel
      var Str all := densities ; var Int i := 0
      while i<gamut_maximum_dimension and i<src_gamut:dimens
        pixel:bytes i := cast d/100*255 Int
        all := remain ; i += 1
      var ColorXYZ pixel_color := src_gamut simulate address
      var ColorXYZ wished_color := pixel_color
      color_adjust wished_color (dest_gamut query "options")
      dest_gamut formulate wished_color addressof:(var Color
      var ColorXYZ result_color := dest_gamut simulate addre
      table columns 3 border 0
        cell
          table columns 2
            for (var Int i) 0 src_gamut:dimension-1
              cell
                text (src_gamut query "component_name "+stri
              cell
                text (string pixel:bytes:i/255*100 "fixed 1"
        cell
          void
        cell
          table columns 2
            for (var Int i) 0 dest_gamut:dimension-1
              cell
                text (dest_gamut query "component_name "+str
              cell
                text (string result:bytes:i/255*100 "fixed 1
        cell
          var ColorXYZn colorn := cast pixel_color ColorXYZn
          text "XYZn "+(string colorn:X "fixed 3")+" "+(stri
          var ColorLCh lch := cast pixel_color ColorLCh
          text "LCh "+(string lch:L "fixed 1")+" "+(string l
        cell
          var ColorXYZn colorn := cast wished_color ColorXYZ
          text "XYZn "+(string colorn:X "fixed 3")+" "+(stri
          var ColorLCh lch := cast wished_color ColorLCh
          text "LCh "+(string lch:L "fixed 1")+" "+(string l
        cell
          var ColorXYZn colorn := cast result_color ColorXYZ
          text "XYZn "+(string colorn:X "fixed 3")+" "+(stri
          var ColorLCh lch := cast result_color ColorLCh
          text "LCh "+(string lch:L "fixed 1")+" "+(string l
        cell color (cast pixel_color ColorRGB888)
          fixed [ ]
        cell void
        cell color (cast result_color ColorRGB888)
          fixed [ ]
  para
    display_spectrum (src_gamut simulate2 addressof:pixel) (
  para
    text "CMC("+string:cmc_distance_l_parameter+","+string:c
para
  page note "sample color conversion tool"
    title "Sample color conversion"
    input "Source gamut: " src_gamut_name length 80
    input "Source densities (in %): " densities length 40
    input "Destination gamut: " dest_gamut_name length 80
    button "Compute"
      reload_page
    para
      var Link:ColorGamut src_gamut :> color_gamut src_gamut_name
      var Link:ColorGamut dest_gamut :> color_gamut dest_gamut_name
      if src_gamut=success and dest_gamut=success
        var ColorBuffer pixel
        var Str all := densities ; var Int i := 0
        while i<gamut_maximum_dimension and i<src_gamut:dimension and (all parse (var Float d) any:(var Str remain))
          pixel:bytes i := cast d/100*255 Int
          all := remain ; i += 1
        var ColorXYZ pixel_color := src_gamut simulate addressof:pixel
        var ColorXYZ pixel_color2 := filter_XYZ (src_gamut simulate2 addressof:pixel)
        dest_gamut formulate pixel_color addressof:(var ColorBuffer result)
        var ColorXYZ result_color := dest_gamut simulate addressof:result
        var ColorXYZ result_color2 := filter_XYZ (dest_gamut simulate2 addressof:result)
        table columns 4 border 0
          cell
            table columns 2
              for (var Int i) 0 src_gamut:dimension-1
                cell
                  text (src_gamut query "component_name "+string:i)
                cell
                  text (string pixel:bytes:i/255*100 "fixed 1")+" %"
          cell
            void
          cell
            void
          cell
            table columns 2
              for (var Int i) 0 dest_gamut:dimension-1
                cell
                  text (dest_gamut query "component_name "+string:i)
                cell
                  text (string result:bytes:i/255*100 "fixed 1")+" %"
          cell
            var ColorXYZn colorn := cast pixel_color ColorXYZn
            text "XYZn "+(string colorn:X "fixed 3")+" "+(string colorn:Y "fixed 3")+" "+(string colorn:Z "fixed 3") ; eol
            var ColorLCh lch := cast pixel_color ColorLCh
            text "LCh "+(string lch:L "fixed 1")+" "+(string lch:C "fixed 1")+" "+(string lch:h "fixed 0")
          cell
            var ColorXYZn colorn := cast pixel_color2 ColorXYZn
            text "XYZn "+(string colorn:X "fixed 3")+" "+(string colorn:Y "fixed 3")+" "+(string colorn:Z "fixed 3") ; eol
            var ColorLCh lch := cast pixel_color ColorLCh
            text "LCh "+(string lch:L "fixed 1")+" "+(string lch:C "fixed 1")+" "+(string lch:h "fixed 0")
          cell
            var ColorXYZn colorn := cast result_color2 ColorXYZn
            text "XYZn "+(string colorn:X "fixed 3")+" "+(string colorn:Y "fixed 3")+" "+(string colorn:Z "fixed 3") ; eol
            var ColorLCh lch := cast result_color ColorLCh
            text "LCh "+(string lch:L "fixed 1")+" "+(string lch:C "fixed 1")+" "+(string lch:h "fixed 0")
          cell
            var ColorXYZn colorn := cast result_color ColorXYZn
            text "XYZn "+(string colorn:X "fixed 3")+" "+(string colorn:Y "fixed 3")+" "+(string colorn:Z "fixed 3") ; eol
            var ColorLCh lch := cast result_color ColorLCh
            text "LCh "+(string lch:L "fixed 1")+" "+(string lch:C "fixed 1")+" "+(string lch:h "fixed 0")
          cell color (cast pixel_color ColorRGB888)
            fixed [ ]
          cell color (cast pixel_color2 ColorRGB888)
            fixed [ ]
          cell color (cast result_color2 ColorRGB888)
            fixed [ ]
          cell color (cast result_color ColorRGB888)
            fixed [ ]
    para
      display_spectrum (src_gamut simulate2 addressof:pixel) (dest_gamut simulate2 addressof:result) (var ColorSpectrum32 no_spectrum)
    para
      text "CMC("+string:cmc_distance_l_parameter+","+string:cmc_distance_c_parameter+") distance is " ; bold text:(string (cmc_distance (cast pixel_color ColorXYZ) (cast result_color ColorXYZ)) "fixed 1") ; eol
  eol
  page note "compute CMC distance"
    title "CMC distance"
    input "Reference LCh: " (var Str color1) length 20
    input "Effective LCh: " (var Str color2) length 20
    page button "Compute CMC distance"
      if (color1 parse (var Float l1) (var Float c1) (var Float h1))
        if (color2 parse (var Float l2) (var Float c2) (var Float h2))
          var ColorLCh lch1 ; lch1 L := l1 ; lch1 C := c1 ; lch1 h := h1
          var ColorLCh lch2 ; lch2 L := l2 ; lch2 C := c2 ; lch2 h := h2
          text "Reference LCh: "+(string l1 "fixed 1")+" "+(string c1 "fixed 1")+" "+(string h1 "fixed 0") ; eol
          text "Effective LCh: "+(string l2 "fixed 1")+" "+(string c2 "fixed 1")+" "+(string h2 "fixed 0") ; eol
          text "CMC distance is "+(string (cmc_distance (cast lch1 ColorLab) (cast lch2 ColorLab)) "fixed 1") ; eol



table columns 3
  cell header [Device]
  cell void
  cell header [Description]
  each d color_database:data:device
    cell
      text keyof:d
    cell
      text d:label
    cell
      page button "edit"
        title "Color device '"+keyof:d+"'"
        page note "printer settings used to build this profi
          title "Printer settings for '"+keyof:d+"' color pr
          var Data:ColorPrinter p :> d printer
          table columns 3 border 0
            cell [Driver:]
            cell
              input "" p:driver length 10
            cell
              [The filter is the Pliant driver.] ; eol
              [Most common filter are] ; fixed [ escp2 ] ; [
              fixed [ pcl ] ; [for HP Designjet (does not wo
              [and ] ; fixed [ gimprint ] ; [if the printer 
            cell [Model:]
            cell
              input "" p:model length 20
            cell
              [Must be one of the models the driver is aware
            cell [Extra options:]
            cell
              input "" p:options length 40
            cell
              [As an example, the] ; fixed [ escp2 ] ; [driv
            cell [Paper name:]
            cell
              input "" p:paper length 40 noeol
            cell
              [This is informative only.]
            cell [Paper size:]
            cell
              input "" p:size_x length 4 noeol
              input " x " p:size_y length 4 noeol
              [ mm]
            cell
              void
            cell [Margins:]
            cell
              input "L" p:margin_left length 3 noeol
              input "T" p:margin_top length 3 noeol
              input "R" p:margin_right length 3 noeol
              input "B" p:margin_bottom length 3 noeol
              [ mm]
            cell
              void
            cell [R鳯lution:]
            cell
              input "" p:resolution_x length 4 noeol
              input " x " p:resolution_y length 4 noeol
              [ dpi]
            cell
              void
            cell [Antialiasing:]
            cell
              input "" p:antialiasing_x length 1 noeol
              input " x " p:antialiasing_y length 1
            cell
              [Use no antialiasing if your computer is slow,
            cell [Sharpening:]
            cell
              input "" p:sharpening length 5
            cell
              [Leave it blank unless you want to experiment.
            cell [Maximum density:]
            cell
              input "" p:limit length 5
            cell
              [Leave it blank unless you know what you do: t
            cell [Middle adjustment:]
            cell
              input "" p:middle length 5
            cell
              [Leave it blank unless you know what you do: t
            cell [Gamut:]
            cell
              input "" p:gamut length 40
            cell
              void
            cell [Calibration steps:]
            cell
              input "" p:grid_steps length 2
            cell
              [How many steps do we compute on the calibrati
              [33 is perfect but will require several hours 
          button "Update"
            goto_backward
        table columns 2 border 0
          cell [Label:]
          cell
            input "" d:label length 60
          cell [Description:]
          cell
            text_input "" d:comment columns 60 rows 10
          cell [Gamut extra options:]
          cell
            input "" d:options length 60 noeol
            button "Update"
              cache_shrink 0 cache_class_costy
              goto_backward
            link "what do these options mean" "/pliant/graph
          
        table columns 5
          cell header [Ink]
          cell header [Sample]
          cell header [Opacity]
          cell void
          cell header [Options]
          each ch d:channel
            cell
              text keyof:ch
            var ColorSpectrum32 a_s0 := ch s0
            var ColorSpectrum32 a_s100 := ch s100
            if a_s0=defined and a_s100=defined
              cell color (cast (filter_XYZ a_s100/a_s0) Colo
                fixed [ ]
            else
              cell void
            cell
              if (ch:options option "opacity" Float)=defined
                text string:(ch:options option "opacity" Flo
            cell
              page button "edit"
                title "Ink '"+keyof:ch+"' for device '"+keyo
                var ColorSpectrum32 s0 := ch s0
                var ColorSpectrum32 s100 := ch s100
table columns 3
  cell header [Device]
  cell void
  cell header [Description]
  each d color_database:data:device
    cell
      text keyof:d
    cell
      text d:label
    cell
      page button "edit"
        title "Color device '"+keyof:d+"'"
        page note "printer settings used to build this profi
          title "Printer settings for '"+keyof:d+"' color pr
          var Data:ColorPrinter p :> d printer
          table columns 3 border 0
            cell [Driver:]
            cell
              input "" p:driver length 10
            cell
              [The filter is the Pliant driver.] ; eol
              [Most common filter are] ; fixed [ escp2 ] ; [
              fixed [ pcl ] ; [for HP Designjet (does not wo
              [and ] ; fixed [ gimprint ] ; [if the printer 
            cell [Model:]
            cell
              input "" p:model length 20
            cell
              [Must be one of the models the driver is aware
            cell [Extra options:]
            cell
              input "" p:options length 40
            cell
              [As an example, the] ; fixed [ escp2 ] ; [driv
            cell [Paper name:]
            cell
              input "" p:paper length 40 noeol
            cell
              [This is informative only.]
            cell [Paper size:]
            cell
              input "" p:size_x length 4 noeol
              input " x " p:size_y length 4 noeol
              [ mm]
            cell
              void
            cell [Margins:]
            cell
              input "L" p:margin_left length 3 noeol
              input "T" p:margin_top length 3 noeol
              input "R" p:margin_right length 3 noeol
              input "B" p:margin_bottom length 3 noeol
              [ mm]
            cell
              void
            cell [R鳯lution:]
            cell
              input "" p:resolution_x length 4 noeol
              input " x " p:resolution_y length 4 noeol
              [ dpi]
            cell
              void
            cell [Antialiasing:]
            cell
              input "" p:antialiasing_x length 1 noeol
              input " x " p:antialiasing_y length 1
            cell
              [Use no antialiasing if your computer is slow,
            cell [Sharpening:]
            cell
              input "" p:sharpening length 5
            cell
              [Leave it blank unless you want to experiment.
            cell [Maximum density:]
            cell
              input "" p:limit length 5
            cell
              [Leave it blank unless you know what you do: t
            cell [Middle adjustment:]
            cell
              input "" p:middle length 5
            cell
              [Leave it blank unless you know what you do: t
            cell [Gamut:]
            cell
              input "" p:gamut length 40
            cell
              void
            cell [Calibration steps:]
            cell
              input "" p:grid_steps length 2
            cell
              [How many steps do we compute on the calibrati
              [33 is perfect but will require several hours 
          button "Update"
            goto_backward
        table columns 2 border 0
          cell [Label:]
          cell
            input "" d:label length 60
          cell [Description:]
          cell
            text_input "" d:comment columns 60 rows 10
          cell [Gamut extra options:]
          cell
            input "" d:options length 60 noeol
            button "Update"
              cache_shrink 0 cache_class_costy
              goto_backward
            link "what do these options mean" "/pliant/graph
          
        table columns 5
          cell header [Ink]
          cell header [Sample]
          cell header [Opacity]
          cell void
          cell header [Options]
          each ch d:channel
            cell
              text keyof:ch
            var ColorSpectrum32 a_s0 := ch s0
            var ColorSpectrum32 a_s100 := ch s100
            if a_s0=defined and a_s100=defined
              cell color (cast (filter_XYZ a_s100/a_s0) Colo
                fixed [ ]
            else
              cell void
            cell
              if (ch:options option "opacity" Float)=defined
                text string:(ch:options option "opacity" Flo
            cell
              page button "edit"
                title "Ink '"+keyof:ch+"' for device '"+keyo
                var ColorSpectrum32 s0 := ch s0
                var ColorSpectrum32 s100 := ch s100
                var CBool composed := (keyof:ch search "+" -
                var Float specular := ch:options+" "+d:optio
                var Float zero := ch:options+" "+d:options option "zero" Float 0
                var ColorSpectrum32 z := cast zero ColorSpectrum32
                var Float deaden := ch:options+" "+d:options
                var Float deaden := ch:options+" "+d:options
                var CBool composed := (keyof:ch search "+" -1)<>(-1)
                var Int maxi := shunt (exists ch:sample:"255
                if s0=defined and s100=defined
                var Int maxi := shunt (exists ch:sample:"255
                if s0=defined and s100=defined
                  check ColorSpectrum32:size=32*Float32:size
                  check ColorSpectrum32:size=31*Float32:size
                  table columns 4 border 0
                    cell
                      var Float mi := 1
                      var Float ma := 0
                      for (var Int w) 0 30
                        mi := min mi (addressof:s100 map Flo
                        ma := max ma (addressof:s100 map Flo
                      text "Absolute reflexion range: "
                      fixed
                        text (string (cast mi*1000 Int)/1000
                      eol
                      var Float mi := 1
                      var Float ma := 0
                      for (var Int w) 0 30
                        mi := min mi (addressof:s100 map Flo
                        ma := max ma (addressof:s100 map Flo
                      text "Relative reflexion range: "
                      fixed
                        text (string (cast mi*1000 Int)/1000
                      eol
                      var ColorXYZ xyz := filter_XYZ s100/s0
                      text "XYZ: "
                      fixed
                        text (string xyz:X "fixed 3")+" "+(s
                      eol
                      var ColorYxy yxy := cast xyz ColorYxy
                      text "Yxy: "
                      fixed
                        text (string yxy:Y "fixed 3")+" "+(s
                      eol
                      var ColorLab lab := cast xyz ColorLab
                      text "L*a*b*: "
                      fixed
                        text (string lab:L "fixed 1")+" "+(s
                      eol
                  table columns 4 border 0
                    cell
                      var Float mi := 1
                      var Float ma := 0
                      for (var Int w) 0 30
                        mi := min mi (addressof:s100 map Flo
                        ma := max ma (addressof:s100 map Flo
                      text "Absolute reflexion range: "
                      fixed
                        text (string (cast mi*1000 Int)/1000
                      eol
                      var Float mi := 1
                      var Float ma := 0
                      for (var Int w) 0 30
                        mi := min mi (addressof:s100 map Flo
                        ma := max ma (addressof:s100 map Flo
                      text "Relative reflexion range: "
                      fixed
                        text (string (cast mi*1000 Int)/1000
                      eol
                      var ColorXYZ xyz := filter_XYZ s100/s0
                      text "XYZ: "
                      fixed
                        text (string xyz:X "fixed 3")+" "+(s
                      eol
                      var ColorYxy yxy := cast xyz ColorYxy
                      text "Yxy: "
                      fixed
                        text (string yxy:Y "fixed 3")+" "+(s
                      eol
                      var ColorLab lab := cast xyz ColorLab
                      text "L*a*b*: "
                      fixed
                        text (string lab:L "fixed 1")+" "+(s
                      eol
                      text "Specular: "+(string specular "fi
                      text "Zero: "+(string zero "fixed 3")
                      eol
                      text "Deaden: "+(string deaden "fixed 
                    var ColorXYZ paper := filter_XYZ s0
                    cell
                      [Paper:] ; eol
                      var ColorLCh lch := cast paper ColorLC
                      [L*C*h] ; small [ ab] ; eol
                      fixed
                        text (string lch:L "fixed 1") ; fixe
                      [Sample and spectrum ->]
                    cell
                      var ColorRGB888 rgb := cast paper Colo
                      image "sample/r"+string:(cast rgb:r In
                    cell
                      display_spectrum s0 (var ColorSpectrum
                input "Options: " ch:options length 60 noeol
                var Float display := ch:options option "dens
                page button "Update"
                  cache_shrink 0 cache_class_costy
                  goto_backward
                table columns (shunt composed 9 7)
                  cell header [Color]
                  cell header
                    [Linear[lf]Thickness[lf]Surface]
                  cell header [Density]
                  cell header [Opacity]
                  cell header [Sample]
                  cell header
                    [L*C*h] ; small [ ab]
                  if composed
                    cell header [computation[lf]color]
                    cell header [computation[lf]sample]
                  cell header
                    [Spectrum] ; eol
                    small [red is measured, green is compute
                  each sample ch:sample sort (right keyof:sa
                    cell
                      text keyof:sample
                    cell
                      if s0=defined
                      eol
                      text "Deaden: "+(string deaden "fixed 
                    var ColorXYZ paper := filter_XYZ s0
                    cell
                      [Paper:] ; eol
                      var ColorLCh lch := cast paper ColorLC
                      [L*C*h] ; small [ ab] ; eol
                      fixed
                        text (string lch:L "fixed 1") ; fixe
                      [Sample and spectrum ->]
                    cell
                      var ColorRGB888 rgb := cast paper Colo
                      image "sample/r"+string:(cast rgb:r In
                    cell
                      display_spectrum s0 (var ColorSpectrum
                input "Options: " ch:options length 60 noeol
                var Float display := ch:options option "dens
                page button "Update"
                  cache_shrink 0 cache_class_costy
                  goto_backward
                table columns (shunt composed 9 7)
                  cell header [Color]
                  cell header
                    [Linear[lf]Thickness[lf]Surface]
                  cell header [Density]
                  cell header [Opacity]
                  cell header [Sample]
                  cell header
                    [L*C*h] ; small [ ab]
                  if composed
                    cell header [computation[lf]color]
                    cell header [computation[lf]sample]
                  cell header
                    [Spectrum] ; eol
                    small [red is measured, green is compute
                  each sample ch:sample sort (right keyof:sa
                    cell
                      text keyof:sample
                    cell
                      if s0=defined
                        var ColorXYZ wished := filter_XYZ co
                        var ColorXYZ wished := filter_XYZ (color_spectrum32:sample-z)/(s0-z)
                      if s0=defined and s100=defined
                      if s0=defined and s100=defined
                        var Float density := ink_linear colo
                        var Float density := ink_linear color_spectrum32:sample-z s0-z s100-z
                        text (string density*100 "fixed 1")+
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        var ColorXYZ got := filter_XYZ (ink_linear_simulation density s0-z s100-z)/(s0-z)
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                        eol
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                        eol
                        var Float density := ink_thickness c
                        var Float density := ink_thickness color_spectrum32:sample-z s0-z s100-z
                        text (string density*100 "fixed 1")+
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        var ColorXYZ got := filter_XYZ (ink_thickness_simulation density s0-z s100-z)/(s0-z)
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                        eol
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                        eol
                        var Float density := ink_surface col
                        var Float density := ink_surface color_spectrum32:sample-z s0-z s100-z
                        text (string (cast density*1000 Int)
                        text (string (cast density*1000 Int)
                        var ColorXYZ got := filter_XYZ (ink_
                        var ColorXYZ got := filter_XYZ (ink_surface_simulation density s0-z s100-z)/(s0-z)
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                    cell
                      if s0=defined and s100=defined
                        var Float err := lab_distance wished
                        fixed [ ] ; small { html "&Delta;E "
                        var Float err := cmc_distance wished
                        fixed [ ] ; small (text "CMC "+(stri
                    cell
                      if s0=defined and s100=defined
                        var Float density := ink_density col
                        var Float density := ink_density color_spectrum32:sample-z s0-z s100-z
                        bold (text (string (exposure density
                        bold (text (string (exposure density
                        if true
                        if false
                          eol
                          eol
                          var Float density0 := ink_density 
                          var Float density0 := ink_density color_spectrum32:sample-z s0-z s100-z (the_function ink_density_simulation Float ColorSpectrum32 ColorSpectrum32 -> ColorSpectrum32) 0 1 (var Float err)
                          small (text (string (exposure dens
                          eol
                          small (text (string (exposure dens
                          eol
                          var Float density2 := ink_density 
                          var Float density2 := ink_density color_spectrum32:sample-z s0-z s100-z (the_function ink_density_simulation Float ColorSpectrum32 ColorSpectrum32 -> ColorSpectrum32) 2 1 (var Float err)
                          small (text (string (exposure dens
                    cell
                      text string:(sample option "opacity" F
                    cell
                      if s0=defined
                          small (text (string (exposure dens
                    cell
                      text string:(sample option "opacity" F
                    cell
                      if s0=defined
                        var ColorRGB888 rgb := cast (filter_
                        var ColorRGB888 rgb := cast (filter_XYZ (color_spectrum32:sample-z)/(s0-z)) ColorRGB888
                        image "sample/r"+string:(cast rgb:r 
                    cell
                      if s0=defined
                        var ColorLCh lch := cast wished Colo
                        text (string lch:L "fixed 1") ; fixe
                    if composed
                        image "sample/r"+string:(cast rgb:r 
                    cell
                      if s0=defined
                        var ColorLCh lch := cast wished Colo
                        text (string lch:L "fixed 1") ; fixe
                    if composed
                      var ColorSpectrum32 s1
                      var Link:ColorGamut g :> color_gamut k
                      var ColorSpectrum32 s1 := var ColorSpectrum32 undefined_spectrum
                      var Link:ColorGamut g :> color_gamut keyof:d+":"+keyof:ch ""
                      if g=success and (keyof:sample parse (
                        var ColorBuffer pixel1
                        for (var Int i) 0 gamut_maximum_dime
                          pixel1:bytes i := level*255\maxi
                        s1 := g simulate2 addressof:pixel1
                      cell
                        var ColorXYZ wished1 := filter_XYZ s
                        var ColorLCh lch1 := cast wished1 Co
                        text (string lch1:L "fixed 1") ; fix
                      cell
                        if s1=defined
                          var ColorRGB888 rgb := cast filter
                          image "sample/r"+string:(cast rgb:
                      cell
                        if s0=defined and s1=defined
                      if g=success and (keyof:sample parse (
                        var ColorBuffer pixel1
                        for (var Int i) 0 gamut_maximum_dime
                          pixel1:bytes i := level*255\maxi
                        s1 := g simulate2 addressof:pixel1
                      cell
                        var ColorXYZ wished1 := filter_XYZ s
                        var ColorLCh lch1 := cast wished1 Co
                        text (string lch1:L "fixed 1") ; fix
                      cell
                        if s1=defined
                          var ColorRGB888 rgb := cast filter
                          image "sample/r"+string:(cast rgb:
                      cell
                        if s0=defined and s1=defined
                          display_spectrum color_spectrum32:
                          display_spectrum (color_spectrum32:sample-z)/(s0-z) s1-z (var ColorSpectrum32 no_spectrum) 
                    else
                      cell
                        if s0=defined
                    else
                      cell
                        if s0=defined
                          display_spectrum color_spectrum32:
                          display_spectrum (color_spectrum32:sample-z)/(s0-z) (var ColorSpectrum32 no_spectrum) (var ColorSpectrum32 no_spectrum)
                input "Color level: " (var Str l) noeol
                page button "Measure" noeol
                  var Str s
                  if (l parse any:(var Str l1) "=" any:(var 
                    l := l1
                    s := color_database:data:device:l2:chann
                  else
                    if not initialized
                      console "initializing spectrocolorimet
                      spectro_init
                      initialized := true
                    s := string spectro_spectrum
                  ch:sample create l
                  ch:sample l := s
                  reload_page
                button "Delete" noeol
                  ch:sample delete l
                  reload_page
                input "Color level: " (var Str l) noeol
                page button "Measure" noeol
                  var Str s
                  if (l parse any:(var Str l1) "=" any:(var 
                    l := l1
                    s := color_database:data:device:l2:chann
                  else
                    if not initialized
                      console "initializing spectrocolorimet
                      spectro_init
                      initialized := true
                    s := string spectro_spectrum
                  ch:sample create l
                  ch:sample l := s
                  reload_page
                button "Delete" noeol
                  ch:sample delete l
                  reload_page
                if s0=defined
                  para
                    input "Gamut: " (var Str gamut_name) len
                    page button "Formulate" noeol
                      title "Color formultation to '"+gamut_
                      var ColorSpectrum32 s0a := ch s0
                      var ColorSpectrum32 s100a := ch s100
                      var Link:ColorGamut gamut :> color_gam
                      table columns 7
                        cell header [Color]
                        cell header
                          [Thickness[lf]Surface[lf]]
                          [L*C*h] ; small [ ab]
                        cell header [Density]
                        cell header [Sample]
                        cell header [Formulation]
                        cell header
                          [L*C*h] ; small [ ab]
                        cell header [Proof color]
                        each sample ch:sample sort (right ke
                          cell
                            text keyof:sample
                          cell
                            if s100a=defined
                              var Float density := ink_thick
                              text (string density*100 "fixe
                              var Float density := ink_surfa
                              text (string density*100 "fixe
                            var ColorLCh lch2 := cast (filte
                            text (string lch2:L "fixed 1") ;
                          cell
                            if s100a=defined
                              var Float density := ink_densi
                              text (string density*100 "fixe
                          cell
                            var ColorRGB888 rgb2 := cast (fi
                            image "sample/r"+string:(cast rg
                          gamut formulate (filter_XYZ color_
                          gamut decode addressof:pixel (var 
                          var ColorXYZ final := gamut simula
                          cell
                            fixed
                              for (var Int dim) 0 gamut:dime
                                text (shunt dim=0 "" " ")+(r
                            eol
                            for (var Int dim) 0 gamut:dimens
                              text (shunt dim=0 "" " ")+(str
                          cell
                            var Float err := lab_distance (f
                            small { html "&Delta;E " ; text 
                            var Float err := cmc_distance (f
                            small (text "CMC "+(string err "
                            var ColorLCh lch2 := cast final 
                            text (string lch2:L "fixed 1") ;
                          cell
                            var ColorRGB888 rgb2 := cast fin
                            image "sample/r"+string:(cast rg
                if s0=defined and s100=defined
                  para
                    image "editor.html?"+(http_encode "devic
                    eol ; small [red is density, green is su
            cell
              text ch:options
        input "Channel ID: " (var Str cid) noeol
        button "Create new ink" noeol
          d:channel create cid
          reload_page
        button "Delete the ink"
          d:channel delete cid
          reload_page
        table columns 4
          cell header [Color]
          cell header [... is an alias of]
          cell header [Sample]
          cell header [Opacity]
          each a d:alias
            cell
              text keyof:a
            cell
              input "" a
            var Data:ColorChannel ch :> d:channel a
            var ColorSpectrum32 a_s0 := ch s0
            var ColorSpectrum32 a_s100 := ch s100
            if a_s0=defined and a_s100=defined
              cell color (cast (filter_XYZ a_s100/a_s0) Colo
                fixed [ ]
            else
              cell void
            cell
              if (ch:options option "opacity" Float)=defined
                text string:(ch:options option "opacity" Flo
        input "Alias ID: " (var Str aid) noeol
        button "Create new alias" noeol
          d:alias create aid
          reload_page
        button "Delete the alias"
          d:alias delete aid
          reload_page
        table columns 2
          cell header [Grid]
          cell header [Steps]
          each g d:grid
            cell
              text keyof:g
            cell
              input "" g length 2
        input "Grid: " (var Str gid) length 40 noeol
        button "Create new grid" noeol
          d:grid create gid
          d:grid gid := undefined
          reload_page
        button "Delete the grid"
          d:grid delete gid
          reload_page
        [A grid value could be 'process_cyan+process_magenta
     


                if s0=defined and s100=defined
                  para
                    image "editor.html?"+(http_encode "devic
                    eol ; small [red is density, green is su
            cell
              text ch:options
        input "Channel ID: " (var Str cid) noeol
        button "Create new ink" noeol
          d:channel create cid
          reload_page
        button "Delete the ink"
          d:channel delete cid
          reload_page
        table columns 4
          cell header [Color]
          cell header [... is an alias of]
          cell header [Sample]
          cell header [Opacity]
          each a d:alias
            cell
              text keyof:a
            cell
              input "" a
            var Data:ColorChannel ch :> d:channel a
            var ColorSpectrum32 a_s0 := ch s0
            var ColorSpectrum32 a_s100 := ch s100
            if a_s0=defined and a_s100=defined
              cell color (cast (filter_XYZ a_s100/a_s0) Colo
                fixed [ ]
            else
              cell void
            cell
              if (ch:options option "opacity" Float)=defined
                text string:(ch:options option "opacity" Flo
        input "Alias ID: " (var Str aid) noeol
        button "Create new alias" noeol
          d:alias create aid
          reload_page
        button "Delete the alias"
          d:alias delete aid
          reload_page
        table columns 2
          cell header [Grid]
          cell header [Steps]
          each g d:grid
            cell
              text keyof:g
            cell
              input "" g length 2
        input "Grid: " (var Str gid) length 40 noeol
        button "Create new grid" noeol
          d:grid create gid
          d:grid gid := undefined
          reload_page
        button "Delete the grid"
          d:grid delete gid
          reload_page
        [A grid value could be 'process_cyan+process_magenta