Patch title: Release 85 bulk changes
Abstract:
File: /pliant/graphic/color/editor.page
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/graphic/misc/float.pli"
module "/pliant/admin/file.pli"
module "/pliant/protocol/http/uvar.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 
module "/pliant/language/unsafe.pli"
module "/pliant/graphic/misc/float.pli"
module "/pliant/admin/file.pli"
module "/pliant/protocol/http/uvar.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 
  img fill 0 0 501 501 addressof:light
  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
  if z_s0=undefined and z_s100=undefined
    return
  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 
    keyof:sample parse (var Float x)
    var Float y := ink_density color_spectrum32:sample z_s0 
    curve1 through x y
    var Float y := ink_surface color_spectrum32:sample z_s0 
    curve2 through x y
    var Float y := ink_thickness color_spectrum32:sample z_s
    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 answer_mime_type := "image/png"
  http_request send_header
  img save http_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
  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
  if z_s0=undefined and z_s100=undefined
    return
  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 
    keyof:sample parse (var Float x)
    var Float y := ink_density color_spectrum32:sample z_s0 
    curve1 through x y
    var Float y := ink_surface color_spectrum32:sample z_s0 
    curve2 through x y
    var Float y := ink_thickness color_spectrum32:sample z_s
    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 answer_mime_type := "image/png"
  http_request send_header
  img save http_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
        var ColorRGB888 rgb := cast pixel_color ColorRGB888
        cell color rgb rgb:r rgb:g rgb:b
        cell color (cast pixel_color ColorRGB888)
          fixed [ ]
        cell void
          fixed [ ]
        cell void
        var ColorRGB888 rgb := cast result_color ColorRGB888
        cell color rgb rgb:r rgb:g rgb:b
        cell color (cast result_color ColorRGB888)
          fixed [ ]
  para
    display_spectrum (src_gamut simulate2 addressof:pixel) (

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"
              color_version += 1
              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
          fixed [ ]
  para
    display_spectrum (src_gamut simulate2 addressof:pixel) (

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"
              color_version += 1
              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
              var ColorRGB888 a_rgb := cast (filter_XYZ a_s1
              # image "sample/r"+string:(cast a_rgb:r Int)+"
              cell color rgb a_rgb:r a_rgb:g a_rgb:b
              cell color (cast (filter_XYZ a_s100/a_s0) ColorRGB888)
                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
                if s0=defined and s100=defined
                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
                if s0=defined and s100=defined
                  para
                    check ColorSpectrum32:size=32*Float32:si
                    var Float mi := 1
                    var Float ma := 0
                    for (var Int w) 0 30
                      mi := min mi ((addressof:s100 translat
                      ma := max ma ((addressof:s100 translat
                    text "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")+" "+(str
                    eol
                    var ColorYxy yxy := cast xyz ColorYxy
                    text "Yxy: "
                    fixed
                      text (string yxy:Y "fixed 3")+" "+(str
                    eol
                    var ColorLab lab := cast xyz ColorLab
                    text "L*a*b*: "
                    fixed
                      text (string lab:L "fixed 1")+" "+(str
                    eol
                    text "Specular: "+(string specular "fixe
                  check ColorSpectrum32:size=32*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 translate Float32 w) map Float32)/((addressof:s0 translate Float32 w) map Float32)
                        ma := max ma ((addressof:s100 translate Float32 w) map Float32)/((addressof:s0 translate Float32 w) map Float32)
                      text "Reflexion range: "
                      fixed
                        text (string (cast mi*1000 Int)/1000)+" "+(string (cast ma*1000 Int)/1000)
                      eol
                      var ColorXYZ xyz := filter_XYZ s100/s0
                      text "XYZ: "
                      fixed
                        text (string xyz:X "fixed 3")+" "+(string xyz:Y "fixed 3")+" "+(string xyz:Z "fixed 3")
                      eol
                      var ColorYxy yxy := cast xyz ColorYxy
                      text "Yxy: "
                      fixed
                        text (string yxy:Y "fixed 3")+" "+(string yxy:x "fixed 3")+" "+(string yxy:y "fixed 3")
                      eol
                      var ColorLab lab := cast xyz ColorLab
                      text "L*a*b*: "
                      fixed
                        text (string lab:L "fixed 1")+" "+(string lab:a "fixed 1")+" "+(string lab:b "fixed 1")
                      eol
                      text "Specular: "+(string specular "fixed 3")
                    var ColorXYZ paper := filter_XYZ s0
                    cell
                      [Paper:] ; eol
                      var ColorLCh lch := cast paper ColorLCh
                      [L*C*h] ; small [ ab] ; eol
                      fixed
                        text (string lch:L "fixed 1") ; fixed [ ] ; text (string lch:C "fixed 1") ; fixed [ ] ; text (string lch:h "fixed 0") ; eol
                      [Sample and spectrum ->]
                    cell
                      var ColorRGB888 rgb := cast paper ColorRGB888
                      image "sample/r"+string:(cast rgb:r Int)+"g"+string:(cast rgb:g Int)+"b"+string:(cast rgb:b Int)
                    cell
                      display_spectrum s0 (var ColorSpectrum32 no_spectrum) (cast no_spectrum ColorSpectrum32)
                input "Options: " ch:options length 60 noeol
                var Float display := ch:options option "dens
                page button "Update"
                  color_version += 1
                  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
                      if s0=defined and s100=defined
                        var Float density := ink_linear colo
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        text (string (cast density*1000 Int)
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        bold (text (string (exposure density
                    cell
                      text string:(sample option "opacity" F
                    cell
                      if s0=defined
                        var ColorRGB888 rgb := cast (filter_
                        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
                      cell
                        part compute_mixture
                          var ColorSpectrum32 s1 := cast 1 C
                          var Str all := keyof ch
                          while all<>""
                            if not (all parse any:(var Str f
                              first := all ; remain := ""
                            var ColorSpectrum32 n1 := color_
                            var ColorSpectrum32 d1 := color_
                            if n1=undefined or d1=undefined
                              s1 := cast (cast undefined Flo
                            n1 := max n1-(cast specular Colo
                            d1 := max d1-(cast specular Colo
                            s1 *= n1/d1
                            all := remain
                          s1 := (1-specular)*s1+(cast specul
                          var ColorXYZ wished1 := filter_XYZ
                          var ColorLCh lch1 := cast wished1 
                          text (string lch1:L "fixed 1") ; f
                      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:
                    else
                      cell
                        if s0=defined
                          display_spectrum color_spectrum32:
                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
                input "Options: " ch:options length 60 noeol
                var Float display := ch:options option "dens
                page button "Update"
                  color_version += 1
                  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
                      if s0=defined and s100=defined
                        var Float density := ink_linear colo
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        text (string density*100 "fixed 1")+
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        text (string (cast density*1000 Int)
                        var ColorXYZ got := filter_XYZ (ink_
                        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
                        bold (text (string (exposure density
                    cell
                      text string:(sample option "opacity" F
                    cell
                      if s0=defined
                        var ColorRGB888 rgb := cast (filter_
                        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
                      cell
                        part compute_mixture
                          var ColorSpectrum32 s1 := cast 1 C
                          var Str all := keyof ch
                          while all<>""
                            if not (all parse any:(var Str f
                              first := all ; remain := ""
                            var ColorSpectrum32 n1 := color_
                            var ColorSpectrum32 d1 := color_
                            if n1=undefined or d1=undefined
                              s1 := cast (cast undefined Flo
                            n1 := max n1-(cast specular Colo
                            d1 := max d1-(cast specular Colo
                            s1 *= n1/d1
                            all := remain
                          s1 := (1-specular)*s1+(cast specul
                          var ColorXYZ wished1 := filter_XYZ
                          var ColorLCh lch1 := cast wished1 
                          text (string lch1:L "fixed 1") ; f
                      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:
                    else
                      cell
                        if s0=defined
                          display_spectrum color_spectrum32:
                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
              var ColorRGB888 a_rgb := cast (filter_XYZ a_s1
              cell color rgb a_rgb:r a_rgb:g a_rgb:b
              cell color (cast (filter_XYZ a_s100/a_s0) ColorRGB888)
                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
     


                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