; The GIMP -- an image manipulation program
; Copyright (C) 1995 Spencer Kimball and Peter Mattis
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 3 of the License, or
; (at your option) any later version.
; 
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
; 
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; http://www.gnu.org/licenses/gpl-3.0.html
;
; Copyright (C) 2011 elsamuko <elsamuko@web.de>
;
; This is the batch version of the photochrom script, run it with
; gimp -i -b '(elsamuko-photochrom-batch "picture.jpg" (list 255 128 0) (list 255 68 112) 60 60 0 100 FALSE FALSE)' -b '(gimp-quit 0)'
; or for more than one picture
; gimp -i -b '(elsamuko-photochrom-batch "*.jpg" (list 255 128 0) (list 255 68 112) 60 60 0 100 FALSE FALSE)' -b '(gimp-quit 0)'


(define (elsamuko-photochrom-batch pattern
                                   color1 color2
                                   contrast bw-merge
                                   num1 num2
                                   dodge retro)
  (let* ((filelist (cadr (file-glob pattern 1))))
    (while (not (null? filelist))
           (let* ((filename (car filelist))
                  (img (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
                  (adraw (car (gimp-image-get-active-drawable img)))
                  (owidth (car (gimp-image-width img)))
                  (oheight (car (gimp-image-height img)))
                  (offset1 (* oheight (/ num1 100)))
                  (offset2 (* oheight (/ num2 100)))
                  (dodge-layer (car (gimp-layer-copy adraw FALSE)))
                  (contrast-layer1 (car (gimp-layer-copy adraw FALSE)))
                  (contrast-layer2 (car (gimp-layer-copy adraw FALSE)))
                  (bw-screen-layer (car (gimp-layer-copy adraw FALSE)))         
                  (bw-merge-layer (car (gimp-layer-copy adraw FALSE)))         
                  (lum-layer     (car (gimp-layer-copy adraw FALSE)))
                  (extra-layer  0)
                  (merge-layer (car (gimp-layer-new img
                                                    owidth 
                                                    oheight
                                                    RGBA-IMAGE
                                                    "Grain Merge" 
                                                    50 
                                                    GRAIN-MERGE-MODE)))
                  (merge-mask (car (gimp-layer-create-mask merge-layer ADD-WHITE-MASK)))
                  (screen-layer (car (gimp-layer-new img
                                                     owidth 
                                                     oheight
                                                     RGBA-IMAGE
                                                     "Screen" 
                                                     10 
                                                     SCREEN-MODE)))
                  (screen-mask (car (gimp-layer-create-mask screen-layer ADD-WHITE-MASK)))
                  (multiply-layer (car (gimp-layer-new img
                                                       owidth 
                                                       oheight
                                                       RGBA-IMAGE
                                                       "Multiply" 
                                                       10 
                                                       MULTIPLY-MODE)))
                  (multiply-mask (car (gimp-layer-create-mask multiply-layer ADD-WHITE-MASK)))
                  (retro-layer (car (gimp-layer-new img
                                                    owidth 
                                                    oheight
                                                    RGBA-IMAGE
                                                    "Retro 1" 
                                                    60 
                                                    MULTIPLY-MODE)))
                  (floatingsel 0)
                  (retro-mask (car (gimp-layer-create-mask retro-layer ADD-WHITE-MASK)))
                  (retro-layer2 (car (gimp-layer-new img
                                                     owidth 
                                                     oheight
                                                     RGBA-IMAGE
                                                     "Retro 2" 
                                                     20 
                                                     SCREEN-MODE)))
                  (gradient-layer (car (gimp-layer-new img
                                                       owidth 
                                                       oheight
                                                       RGBA-IMAGE
                                                       "Gradient Overlay" 
                                                       100 
                                                       OVERLAY-MODE)))
                  )
             
             ; init
             (gimp-message "begin")
             (gimp-context-push)
             (gimp-image-undo-group-start img)
             (if (= (car (gimp-drawable-is-gray adraw )) TRUE)
                 (gimp-image-convert-rgb img)
                 )
             
             ;set extra color layer
             (gimp-message "set extra color layer")
             (gimp-image-add-layer img lum-layer 0)
             (gimp-drawable-set-name lum-layer "Luminosity")
             (gimp-desaturate-full lum-layer DESATURATE-LIGHTNESS)
             (gimp-layer-set-mode lum-layer GRAIN-EXTRACT-MODE)
             (gimp-edit-copy-visible img)
             (set! extra-layer (car (gimp-layer-new-from-visible img img "Extra Color")))
             (gimp-image-add-layer img extra-layer 0)
             (gimp-layer-set-mode extra-layer GRAIN-MERGE-MODE)
             (gimp-layer-set-opacity extra-layer 50)
             (gimp-drawable-set-visible lum-layer FALSE)
             
             ;set BW screen layer
             (gimp-message "set BW screen layer")
             (gimp-image-add-layer img bw-screen-layer -1)
             (gimp-drawable-set-name bw-screen-layer "BW Screen")
             (gimp-layer-set-mode bw-screen-layer SCREEN-MODE)
             (gimp-layer-set-opacity bw-screen-layer 50)
             (gimp-desaturate-full bw-screen-layer DESATURATE-LUMINOSITY)
             
             ;set BW merge layer
             (gimp-message "set BW merge layer")
             (gimp-image-add-layer img bw-merge-layer -1)
             (gimp-drawable-set-name bw-merge-layer "BW Merge")
             (gimp-layer-set-mode bw-merge-layer GRAIN-MERGE-MODE)
             (gimp-layer-set-opacity bw-merge-layer bw-merge)
             (gimp-desaturate-full bw-merge-layer DESATURATE-LUMINOSITY)
             (gimp-curves-spline bw-merge-layer HISTOGRAM-VALUE 6 #(0 144 88 42 255 255))
             
             ;set contrast layers
             (gimp-message "set contrast layers")
             (gimp-image-add-layer img contrast-layer1 -1)
             (gimp-drawable-set-name contrast-layer1 "Contrast1")
             (gimp-layer-set-mode contrast-layer1 OVERLAY-MODE)
             (gimp-layer-set-opacity contrast-layer1 contrast)
             (gimp-desaturate-full contrast-layer1 DESATURATE-LUMINOSITY)
             
             (gimp-image-add-layer img contrast-layer2 -1)
             (gimp-drawable-set-name contrast-layer2 "Contrast2")
             (gimp-layer-set-mode contrast-layer2 OVERLAY-MODE)
             (gimp-layer-set-opacity contrast-layer2 contrast)
             (gimp-desaturate-full contrast-layer2 DESATURATE-LUMINOSITY)
             
             ;set dodge layer
             (gimp-message "set dodge layer")
             (gimp-image-add-layer img dodge-layer -1)
             (gimp-drawable-set-name dodge-layer "Dodge")
             (gimp-layer-set-mode dodge-layer DODGE-MODE)
             (gimp-layer-set-opacity dodge-layer 50)
             
             ;set merge layer
             (gimp-message "set merge layer")
             (gimp-image-add-layer img merge-layer -1)
             (gimp-selection-all img)
             (gimp-context-set-foreground color1)
             (gimp-edit-bucket-fill merge-layer FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
             (gimp-message "set merge layer3")
             (gimp-layer-add-mask merge-layer merge-mask)
             (gimp-context-set-foreground '(255 255 255))
             (gimp-message "set merge layer4")
             (gimp-context-set-background '(0 0 0))
             (gimp-edit-blend merge-mask FG-BG-RGB-MODE
                              NORMAL-MODE GRADIENT-LINEAR
                              100 0 REPEAT-NONE
                              TRUE FALSE 1 0
                              TRUE 0 offset1 0 offset2)
             
             ;set screen layer
             (gimp-message "set screen layer")
             (gimp-image-add-layer img screen-layer -1)
             (gimp-selection-all img)
             (gimp-context-set-foreground color1)
             (gimp-edit-bucket-fill screen-layer FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
             (gimp-layer-add-mask screen-layer screen-mask)
             (gimp-context-set-foreground '(255 255 255))
             (gimp-context-set-background '(0 0 0))
             (gimp-edit-blend screen-mask FG-BG-RGB-MODE
                              NORMAL-MODE GRADIENT-LINEAR
                              100 0 REPEAT-NONE
                              TRUE FALSE 1 0
                              TRUE 0 offset1 0 offset2)
             
             ;set multiply layer
             (gimp-message "set multiply layer")
             (gimp-image-add-layer img multiply-layer -1)
             (gimp-selection-all img)
             (gimp-context-set-foreground color2)
             (gimp-edit-bucket-fill multiply-layer FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
             (gimp-layer-add-mask multiply-layer multiply-mask)
             (gimp-context-set-foreground '(255 255 255))
             (gimp-context-set-background '(0 0 0))
             (gimp-edit-blend multiply-mask FG-BG-RGB-MODE
                              NORMAL-MODE GRADIENT-LINEAR
                              100 0 REPEAT-NONE
                              TRUE FALSE 1 0
                              TRUE 0 offset1 0 offset2)
             
             ;optional retro colors
             (if(= retro TRUE)(begin
                                (gimp-message "optional retro colors")
                                
                                ;yellow with mask
                                (gimp-image-add-layer img retro-layer -1)
                                (gimp-selection-all img)
                                (gimp-context-set-foreground '(251 242 163))
                                (gimp-edit-bucket-fill retro-layer FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
                                (gimp-layer-add-mask retro-layer retro-mask)
                                (gimp-edit-copy contrast-layer1)
                                (set! floatingsel (car (gimp-edit-paste retro-mask TRUE)))
                                (gimp-floating-sel-anchor floatingsel)
                                
                                ;rose
                                (gimp-image-add-layer img retro-layer2 -1)
                                (gimp-selection-all img)
                                (gimp-context-set-foreground '(232 101 179))
                                (gimp-edit-bucket-fill retro-layer2 FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
                                
                                ;gradient overlay
                                (gimp-image-add-layer img gradient-layer -1)
                                (gimp-context-set-foreground '(255 255 255))
                                (gimp-context-set-background '(0 0 0))
                                (gimp-edit-blend gradient-layer FG-BG-RGB-MODE
                                                 NORMAL-MODE GRADIENT-LINEAR
                                                 100 0 REPEAT-NONE
                                                 FALSE FALSE 1 0
                                                 TRUE 0 offset1 0 offset2)
                                
                                ;deactivate orange layers
                                (gimp-drawable-set-visible merge-layer FALSE)
                                (gimp-drawable-set-visible screen-layer FALSE)
                                (gimp-drawable-set-visible multiply-layer FALSE)
                                )
                )
             
             ;dodge b/w
             (gimp-message "dodge b/w")
             (if(= dodge TRUE)(begin
                                (gimp-desaturate-full dodge-layer DESATURATE-LUMINOSITY)
                                (gimp-drawable-set-visible extra-layer FALSE)
                                )
                )
             
             ; tidy up
             ;(gimp-image-undo-group-end img)
             ;(gimp-displays-flush)
             ;(gimp-context-pop)
             (gimp-message "tidy up")
             (gimp-image-merge-visible-layers img EXPAND-AS-NECESSARY)
             (set! adraw (car (gimp-image-get-active-drawable img)))
             (gimp-file-save RUN-NONINTERACTIVE img adraw filename filename)
             (gimp-image-delete img)
             )
           (set! filelist (cdr filelist))
           )
    )
  )
