(define (script-fu-ani-rotate img inLayer inTotAngle inIncCount inVertical inBG inFlatten) (set! pi 3.141592654) ;duplicate the original image (set! img (car (gimp-channel-ops-duplicate img))) (if (= inFlatten TRUE) (gimp-image-flatten img)) (set! width (car (gimp-image-width img))) (set! height (car (gimp-image-height img))) (set! srcLayer (car (gimp-image-get-active-layer img))) ;it begins here (gimp-undo-push-group-start img) ;hide all layers (set! layers (car(cdr (gimp-image-get-layers img)))) (set! nLayers (car (gimp-image-get-layers img))) (set! i 0) (while (< i nLayers) (set! layer (aref layers i)) (gimp-layer-set-visible layer 0) (set! i (+ i 1)) ) ;do the frames (set! counter 0) (set! a 0) (set! inc (/ inTotAngle inIncCount)) (while (< counter inIncCount) (set! aRad (* (/ a 180) pi)) (set! newLayer (car (gimp-layer-copy srcLayer FALSE))) (gimp-image-add-layer img newLayer 0) (gimp-layer-set-visible newLayer TRUE) (if (= inVertical TRUE) (begin (set! newWidth width) (set! newHeight (* height (cos aRad))) ) ) (if (= inVertical FALSE) (begin (set! newWidth (* width (cos aRad))) (set! newHeight height) ) ) (set! newWidth (abs newWidth)) (set! newHeight (abs newHeight)) (if (< newWidth 1) (set! newWidth 1) ) (if (< newHeight 1) (set! newHeight 1) ) (if (and (> a 90) (< a 270)) (begin (if (= inVertical FALSE) (gimp-flip newLayer 0)) (if (= inVertical TRUE) (gimp-flip newLayer 1)) ) ) (gimp-layer-scale newLayer newWidth newHeight TRUE) ;add background layer (set! whiteLayer (car (gimp-layer-new img width height 1 "White layer" 100 0))) (gimp-image-add-layer img whiteLayer 0) (gimp-layer-set-visible whiteLayer TRUE) (if (= inBG TRUE) (gimp-drawable-fill whiteLayer 1)) (if (= inBG FALSE) (begin (gimp-selection-all img) (gimp-edit-clear whiteLayer) (gimp-selection-none img) ) ) (gimp-image-lower-layer img whiteLayer) (set! resLayer (car (gimp-image-merge-visible-layers img 1))) (gimp-layer-set-visible resLayer FALSE) (set! a (+ a inc)) (set! counter (+ counter 1)) ) (gimp-image-remove-layer img srcLayer) ;show all layers (set! layers (car(cdr (gimp-image-get-layers img)))) (set! nLayers (car (gimp-image-get-layers img))) (set! i 0) (while (< i nLayers) (set! layer (aref layers i)) (gimp-layer-set-visible layer 1) (set! i (+ i 1)) ) ;it ends here (gimp-undo-push-group-end img) (gimp-display-new img) ) ;***************************save into PDB (script-fu-register "script-fu-ani-rotate" "/Script-Fu/Animators/Rotation (2)..." "Make turn the picture horizontally with the given angle" "Eric COUTIER" "Eric COUTIER" "2001-07-09" "" SF-IMAGE "image" 0 SF-DRAWABLE "drawable" 0 SF-ADJUSTMENT "total angle" '(360 0 360 1 10 0 0) SF-ADJUSTMENT "inc number" '(15 2 100 1 2 0 1) SF-TOGGLE "vertical" FALSE SF-TOGGLE "add background to each frame" TRUE SF-TOGGLE "flatten before anim" TRUE )