;; sequence-darkenfile.scm -*-scheme-*- ;; ;; Modifications done by Yoonsuck Choe ;; Wed Jul 6 11:10:46 CDT 2005 ;; - add alpha channel ;; - make each layer on top to be "darken only" ;; ----------- ;; Load Sequence (script-fu-sequence-load) - Load numbered sequence of images ;; from disk and possibly combine them into one image ;; ;; Save Sequence (script-fu-sequence-save) - Save all layers to numbered ;; sequence of images on disk ;; ;; This is a version compatible with GIMP v1.1.22 ;; ;; Copyright (C) 2000 by Jaroslav Benkovsky ;; Released under General Public License (GPL) ;; ;; $Id: sequence-file.scm,v 1.7 2000/07/02 22:26:16 benkovsk Exp $ ;; ;; Requires: ;; script-fu ;; ;; Notes: ;; - loaded images should have one layer only, the rest is ignored ;; - if any source image or layer doesn't exist, script aborts. Should be ;; changed? ;; ;; TODO: ;; sequence-split -- split loaded image into one image for each layer ;; sequence-merge -- merge loaded images into one image ;; iterate -- apply user defined SIOD to each Image/Layer matching regexp ;; specify image format ;; Example: ;; (script-fu-sequence-load "worx/atomix/pov/m_intro%%.tga" "Layer % (replace)" 1 10 TRUE) ;; ;; split template into list (define (string-template-split str first_number) (let* ( (tplchar "%") (digits "0123456789") (len (string-length str)) (f1 (strcspn str tplchar)) ) (if (= f1 len) (begin (set! f1 (strcspn str digits)) (if (= f1 len) (error "Can't insert number to template" str) (set! fs digits))) (set! fs tplchar)) (set! hdr (substring str 0 f1)) (set! str (substring str f1 len)) (set! len (- len f1)) (set! f2 (strspn str fs)) (set! body (substring str 0 f2)) (set! ftr (substring str f2 len)) (set! fill (string-length body)) (if (eq? fs tplchar) (set! body 0) (set! body (- (string->number body 10) first_number))) (set! return (list hdr body ftr fill)) )) ;; build string from template & param (define (string-template-expand seq tpl) (begin (set! body (number->string (+ seq (cadr tpl)) 10 (car (last tpl)))) (set! str (string-append (car tpl) body (caddr tpl))) )) ;; Load Sequence (define (script-fu-sequence-load-darken filetpl layertpl first_frame last_frame make_one_image? step) (let* ( (f_tpl (string-template-split filetpl first_frame)) (l_tpl (if (= make_one_image? TRUE) (string-template-split layertpl first_frame))) ) (set! seq first_frame) (while (or (<= seq last_frame) (= last_frame 0)) (set! f_name (string-template-expand seq f_tpl)) (set! errobj ()) (set! qqq (gimp-file-load 1 f_name filetpl)) ; (set! src_img (car (gimp-file-load 1 f_name filetpl))) (if (eq? errobj ()) ; check for error during load (begin (set! src_img (car qqq)) (if (= make_one_image? TRUE) (begin ; (= make_one_image TRUE) (set! l_name (string-template-expand seq l_tpl)) (set! layers (gimp-image-get-layers src_img)) ; (set! layer_cnt (car layers)) (set! src_layer (aref (cadr layers) 0)) (set! type (car (gimp-drawable-type src_layer))) ;;(eval (read-from-string "(file-jpg-load ...)")) (if (= seq first_frame) (begin ; (= seq first_frame) (set! main_img src_img) (set! width (car (gimp-drawable-width src_layer))) (set! height (car (gimp-drawable-height src_layer))) (gimp-image-undo-disable main_img)) (begin ; (!= seq first_frame) (gimp-edit-copy src_layer) (set! tgt_layer (car (gimp-layer-new main_img width height type l_name 100 DARKEN-ONLY-MODE))) (gimp-image-add-layer main_img tgt_layer -1) (gimp-layer-add-alpha tgt_layer) (gimp-edit-clear tgt_layer) ; (set! tgt_layer (car (gimp-edit-paste tgt_layer 0))) ; (gimp-floating-sel-anchor tgt_layer) (let ((floating-sel (car (gimp-edit-paste tgt_layer FALSE)))) (gimp-floating-sel-anchor floating-sel)) (gimp-image-delete src_img)))) (begin ; (!= make_one_image TRUE) (gimp-image-clean-all src_img) (gimp-display-new src_img))) (set! seq (+ seq step))) (begin ; Error during load: (!= errobj ()) (error "eee" errobj) (set! last_frame -1))) ) ; cleanup (if (= make_one_image? TRUE) (begin (gimp-image-clean-all main_img) (gimp-image-undo-enable main_img) (gimp-display-new main_img))) )) ;; Save Sequence (define (script-fu-sequence-save-draken src_img drawable filetpl first_frame last_frame preserve_size? preserve_bg?) (let* ((f_tpl (string-template-split filetpl first_frame)) (type (car (gimp-drawable-type drawable))) (img_width (car (gimp-image-width src_img))) (img_height (car (gimp-image-height src_img))) (img_type (cond ((= type RGB_IMAGE) RGB) ((= type RGBA_IMAGE) RGB) ((= type GRAY_IMAGE) GRAY) ((= type GRAYA_IMAGE) GRAY) ((= type INDEXED_IMAGE) INDEXED) ((= type INDEXEDA_IMAGE) INDEXED)))) (set! layers (gimp-image-get-layers src_img)) (set! layer_cnt (car layers)) (if (or (> last_frame layer_cnt) (= last_frame 0)) (set! last_frame layer_cnt)) ; FIXME: more checks for first_frame; but tpl's are already set! (set! seq first_frame) (while (<= seq last_frame) (set! src_layer (aref (cadr layers) (- layer_cnt seq))) (set! f_name (string-template-expand seq f_tpl)) (set! width (car (gimp-drawable-width src_layer))) (set! height (car (gimp-drawable-height src_layer))) (set! type (car (gimp-drawable-type src_layer))) (gimp-edit-copy src_layer) (set! tgt_img (car (gimp-image-new width height img_type))) (set! tgt_layer (car (gimp-layer-new tgt_img width height type "layer" 100 DARKEN-ONLY-MODE))) (gimp-image-add-layer tgt_img tgt_layer 0) (gimp-layer-add-alpha tgt_layer) (if (= preserve_bg? TRUE) (begin (gimp-edit-clear tgt_layer)) (begin (gimp-drawable-fill tgt_layer BG-IMAGE-FILL))) (let ((floating-sel (car (gimp-edit-paste tgt_layer FALSE)))) (gimp-floating-sel-anchor floating-sel)) (if (= preserve_size? TRUE) (begin (set! offset (gimp-drawable-offsets src_layer)) (gimp-image-resize tgt_img img_width img_height (car offset) (cadr offset)))) (gimp-file-save 1 tgt_img tgt_layer f_name f_name) (gimp-image-clean-all tgt_img) (gimp-image-delete tgt_img) (set! seq (+ seq 1)) ) )) (script-fu-register "script-fu-sequence-load-darken" "/Xtns/Script-Fu/Utils/Load Sequence (Darken)" "Load numbered sequence of images from disk, possibly combining them into single image." "Jaroslav Benkovsky " "Jaroslav Benkovsky" "July 2000" "" SF-FILENAME "File Name Template" "pict%%.tga" SF-STRING "Layer Name Template" "Layer % (200ms) (combine)" SF-ADJUSTMENT "First Frame" '(1 0 100000 1 10 0 1) SF-ADJUSTMENT "Last Frame" '(10 0 100000 1 10 0 1) SF-TOGGLE "Make One Image" TRUE SF-VALUE "Step" "0" ) (script-fu-register "script-fu-sequence-save-darken" "/File/Save Sequence (Darken)" "Save all layers to numbered sequence of images on disk." "Jaroslav Benkovsky " "Jaroslav Benkovsky" "July 2000" "" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-FILENAME "File Name Template" "pict%%.tga" SF-ADJUSTMENT "First Frame" '(1 1 100000 1 10 0 1) SF-ADJUSTMENT "Last Frame (0: all)" '(0 0 100000 1 10 0 1) SF-TOGGLE "Preserve size (unimplemented)" FALSE SF-TOGGLE "Preserve background" TRUE ) ;; End of file sequence-file.scm