Patch title: Release 87 bulk changes
Abstract:
File: /pliant/appli/photo/photo.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/admin/file.pli"
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/http/style/draw.pli"
module "/pliant/protocol/http/common/cache.pli"
module "/pliant/protocol/http/cache.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/image/lazy.pli"
module "/pliant/graphic/filter/io.pli"
module "jpeg.pli"
module "env.pli"
module "load.pli"
module "print.pli"


method page sample name instruction
  arg_rw HtmlPage page ; arg Str name instruction
  implicit page
    cell
      if (photo_load name "reset "+instruction+" resample "+string:icon_size_x+" "+string:icon_size_y (var Link:ImagePrototype photo))=success
        draw photo options "no_lazy"
      eol
      fixed html:(shunt instruction<>"" instruction "&nbsp;")

method page samples name instruction
  arg_rw HtmlPage page ; arg Str name instruction
  page sample name instruction+" -0.25"
  page sample name instruction+" -0.1"
  page sample name ""
  page sample name instruction+" 0.1"
  page sample name instruction+" 0.25"

method page photo root_path
  arg_rw HtmlPage page ; arg Str root_path
  implicit page
    if (virtual_path 0 1)<>"/"
      return
    var Int aa_x := max (min resample_antialiasing_x 1) 8
    var Int aa_y := max (min resample_antialiasing_y 1) 8
    var Str subpath := virtual_path 1 virtual_path:len
    if (virtual_path virtual_path:len-1)="/"
      var Array:FileInfo files := file_list root_path+subpath standard+directories+relative+sorted
      var Int columns := max (min icon_columns 100) 1
      table columns columns border 0
        for (var Int i) 0 files:size-1
          if files:i:is_directory
            if options="level2" and (files:i:name 0 1)<>"."
              var Array:FileInfo files2 := file_list root_path+files:i:name standard+relative
              var List:Str images := var List:Str empty_list ; var Int count := 0
              for (var Int j) 0 files2:size-1
                if (lower files2:j:extension)=".jpeg" or (lower files2:j:extension)=".jpg"
                  photo_cache root_path+subpath+files:i:name+files2:j:name ".icon/" "jpeg" "resample "+string:icon_size_x+" "+string:icon_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:icon_quality
                  images += files2:j:name ; count += 1
              cell
                link files:i:name files:i:name
                fixed [ ] ; small (text string:count)
              var Int col := 1
              while col<columns and count>0
                memory_random addressof:(var uInt r) uInt:size
                r %= cast count uInt
                var Pointer:Str s :> images first
                for (var Int j) 1 r
                  s :> images next s
                cell
                  var Str icon := photo_cache root_path+subpath+files:i:name+s ".icon/" "jpeg" "resample "+string:icon_size_x+" "+string:icon_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:icon_quality
                  var Str url := image_cache_record icon "" "jpeg" ""
                  var Str target := files:i:name+s
                  icon url
                    goto_url target
                col += 1
                images remove s ; count -= 1
              for (var Int j) col columns-1
                cell void
          eif (lower files:i:extension)=".jpeg" or (lower files:i:extension)=".jpg"
            cell
              var Str icon := photo_cache root_path+subpath+files:i:name ".icon/" "jpeg" "resample "+string:icon_size_x+" "+string:icon_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:icon_quality
              var Str url := image_cache_record icon "" "jpeg" ""
              var Str target := files:i name
              icon url
                goto_url target
              # image files:i:name+"?icon+"+generate_id files:i:name
      for (var Int i) 0 files:size-1
        if files:i:is_directory
          if options<>"level2" and (files:i:name 0 1)<>"."
            link files:i:name files:i:name ; eol
        eif (lower files:i:extension)<>".jpeg" and (lower files:i:extension)<>".jpg"
          font color (color hsl 0 0 50)
            text files:i:name ; eol
    else
      var Str screen := ""
      if screen_options<>""
        screen += " extra "+string:screen_options
      if false
        if screen_temperature<>5000
          screen += " screen_temperature "+(string page:screen_temperature)
        if screen_orthogonal<>5000
          screen += " screen_orthogonal "+(string page:screen_orthogonal)
      var Str commands := jpeg_get_comment root_path+subpath
      var Str action := "zoom"
      var ExtendedStatus status := photo_load root_path+subpath "resample "+string:edit_size_x+" "+string:edit_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:edit_quality+screen (var Link:ImagePrototype photo)
      if status=success
        page draw photo position
          selected (var Float x0) (var Float y0) (var Float x1) (var Float y1)
          if (commands option "rotate_left") or (commands option "rotate_right")
            swap x0 y0 ; swap x1 y1
          if x1<x0
            swap x0 x1
          if y1<y0
            swap y0 y1
          if action="zoom"
            var ExtendedStatus status2 := photo_load root_path+subpath "crop "+string:x0+" "+string:y0+" "+string:x1+" "+string:y1+" resample "+string:zoom_size_x+" "+string:zoom_size_y+" stretch" (var Link:ImagePrototype zoom)
            if status2=success
              draw zoom
            # para
            #   text "zoom "+string:x0+" "+string:y0+" "+string:x1+" "+string:y1
          eif action="crop" or action="uncrop"
            var Str rotate := shunt (commands option "rotate_left") "rotate_left" (commands option "rotate_right") "rotate_right" ""
            var Float exposure := commands option "exposure" Float
            var Float dark := commands option "dark" Float
            var Float light := commands option "light" Float
            var Float dull := commands option "dull" Float
            var Float contrast := commands option "contrast" Float
            var Float temperature := commands option "temperature" Float
            var Float orthogonal := commands option "orthogonal" Float
            var Float saturation := commands option "saturation" Float
            var Str cmd := ""
            if action="crop"
              cmd += " crop "+(string x0 "fixed 0")+" "+(string y0 "fixed 0")+" "+(string x1 "fixed 0")+" "+(string y1 "fixed 0")
            if rotate<>""
              cmd += " "+rotate
            if exposure=defined
              cmd += " exposure "+string:exposure
            if dark=defined
              cmd += " dark "+string:dark
            if light=defined
              cmd += " light "+string:light
            if dull=defined
              cmd += " dull "+string:dull
            if contrast=defined
              cmd += " contrast "+string:contrast
            if temperature=defined
              cmd += " temperature "+string:temperature
            if orthogonal=defined
              cmd += " orthogonal "+string:orthogonal
            if saturation=defined
              cmd += " saturation "+string:saturation
            if cmd<>commands
              jpeg_set_comment root_path+subpath cmd
            reload_page
          else
            reload_page
      else
        para
          italic (text status:message)
      table columns 4 border 0 padding 0 spacing 2
        cell
          if allowed:"photo_edit"
            select "Action:" action noeol
              option "Zoom" "zoom"
              option "Crop" "crop"
              option "Uncrop" "uncrop"
            eol
            var Str rotate := shunt (commands option "rotate_left") "rotate_left" (commands option "rotate_right") "rotate_right" ""
            select "Rotate: " rotate noeol
              option "" ""
              option "left" "rotate_left"
              option "right" "rotate_right"
        cell
          if allowed:"photo_edit"
            var Float exposure := commands option "exposure" Float
            var Str extra := ""
            input "exposure: " exposure length 5 noeol
            var Float dark := commands option "dark" Float
            if advanced
              input "dark: " dark length 5 noeol
            eif dark=defined
              extra += " dark "+string:dark
            var Float light := commands option "light" Float
            if advanced
              input "light: " light length 5 noeol
            eif light=defined
              extra += " light "+string:light
            var Float dull := commands option "dull" Float
            if advanced
              input "dull: " dull length 5 noeol
            eif dull=defined
              extra += " dull "+string:dull
            var Float contrast := commands option "contrast" Float
            input "contrast: " contrast length 5 noeol
            eol
            var Float temperature := commands option "temperature" Float
            input "temperature: " temperature length 4 noeol noeol
            var Float orthogonal := commands option "orthogonal" Float
            input "g.r.: " orthogonal length 4 noeol noeol
            var Float saturation := commands option "saturation" Float
            input "saturation: " saturation length 5 noeol
        cell
          if allowed:"photo_edit"
            page button "Update" noeol
              var Str cmd := ""
              if ((commands (commands option_position "crop" 0) commands:len) parse word:"crop" (var Float x0) (var Float y0) (var Float x1) (var Float y1) any) and action<>"uncrop"
                cmd += " crop "+(string x0 "fixed 0")+" "+(string y0 "fixed 0")+" "+(string x1 "fixed 0")+" "+(string y1 "fixed 0")
              if rotate<>""
                cmd += " "+rotate
              if exposure=defined
                cmd += " exposure "+string:exposure
              if advanced
                if dark=defined
                  cmd += " dark "+string:dark
                if light=defined
                  cmd += " light "+string:light
                if dull=defined
                  cmd += " dull "+string:dull
              else
                cmd += extra
              if contrast=defined
                cmd += " contrast "+string:contrast
              if temperature=defined
                cmd += " temperature "+string:temperature
              if orthogonal=defined
                cmd += " orthogonal "+string:orthogonal
              if saturation=defined
                cmd += " saturation "+string:saturation
              if cmd<>commands
                jpeg_set_comment root_path+subpath cmd
              reload_page
          if allowed:"photo_print"
            fixed [   ]
            icon "/pliant/appli/photo/printer.png"
              title "Print photo"
              var Float mm_x := print_mm_x ; var Float mm_y := print_mm_y
              var Float offset_x := 0 ; var Float offset_y := 0
              input "Photo size on paper: " mm_x length 3 noeol ; [ x ]
              input "" mm_y length 3 noeol ; [ (horizontal x vertical in mm)] ; eol
              input "Photo offset on paper: " offset_x length 3 noeol ; [ , ]
              input "" offset_y length 3 noeol ; [ (horizontal, vertical in mm)] ; eol
              var Str queue := default_printer
              select "Printer: " queue
                each p this_computer:env:"printer"
                  option p:"label" keyof:p
              button "print it"
                var ExtendedStatus status2 := photo_print root_path+subpath mm_x mm_y offset_x offset_y queue
                if status2=success
                  goto_backward
                else
                  text "failed: "+status2:message
      small text:commands ; fixed [  ]
      note "help"
        var Str name := root_path+subpath
        table columns 5
          samples name "exposure"
          samples name "dark"
          samples name "light"
          sample name "dull -0.05"
          sample name "dull -0.01"
          sample name ""
          sample name "dull 0.01"
          sample name "dull 0.05"
          samples name "contrast"
          sample name "temperature 3500"
          sample name "temperature 4500"
          sample name "temperature 5000"
          sample name "temperature 5500"
          sample name "temperature 6500"
          sample name "orthogonal 3500"
          sample name "orthogonal 4500"
          sample name "orthogonal 5000"
          sample name "orthogonal 5500"
          sample name "orthogonal 6500"
          samples name "saturation"
        execute_dynamic_page "pliant:/pliant/graphic/color/adjust.html"
      if allowed:"photo_download"
        fixed [     ]
        note "download"
          var ExtendedStatus status2 := photo_load root_path+subpath "" (var Link:ImagePrototype photo2)
          if status2=success
            reset_http_answer
            http_request answer_mime_type := "binary/*"
            http_request send_header
            photo2 save http_request:stream "filter [dq].jpeg[dq] quality 1"
            http_request send_header "mime [dq]binary/*[dq]"
            photo2 save http_request:answer_stream "filter [dq].jpeg[dq] quality 1"
            http_request send_footer
      eol
      table columns 2 border 0
        cell
          [Original:]
        cell
          [Corrected:]
        cell
          var ExtendedStatus status := photo_load root_path+subpath "resample "+string:control_size_x+" "+string:control_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:edit_quality+" no_crop reset"+screen (var Link:ImagePrototype photo)
          if status=success
            draw photo
        cell
          var ExtendedStatus status := photo_load root_path+subpath "resample "+string:control_size_x+" "+string:control_size_y+" antialiasing "+string:aa_x+" "+string:aa_y+" quality "+string:edit_quality+" no_crop"+screen (var Link:ImagePrototype photo)
          if status=success
            draw photo

export '. photo'