; Star Effect Filter rel 3.2
; Created by Graechan
; You  will need to install GMIC to run this Scipt using option hard
; GMIC can be downloaded from http://sourceforge.net/projects/gmic/files/
; Comments directed to http://gimpchat.com or http://gimpscripts.com
;
; License: GPLv3
;    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.
;
;    To view a copy of the GNU General Public License
;    visit: http://www.gnu.org/licenses/gpl.html
;
;
; ------------
;| Change Log |
; ------------ 
; Rel 0.01 - Initial Release
; Rel 0.02 - Just better now with 2 Scripts
; Rel 2.1  - Added more adjustments to the Soft filter
; Rel 3.0  - Added setting for number of spikes
; Rel 3.1  - added more checks and balances
; Rel 3.2  - Improved layer merging
;
; Include layer Procedure
(define (include-layer image newlayer oldlayer stack)	;stack 0=above 1=below
	(cond ((defined? 'gimp-image-get-item-position) ;test for 2.8 compatability
            (gimp-image-insert-layer image newlayer (car (gimp-item-get-parent oldlayer)) 
			(+ (car (gimp-image-get-item-position image oldlayer)) stack))                                     ;For GIMP 2.8 
          )
          (else
           (gimp-image-add-layer image newlayer (+ (car (gimp-image-get-layer-position image oldlayer)) stack)) ;For GIMP 2.6 
          )
    ) ;end cond
) ;end include layer procedure
;
(define (script-fu-star-effect-filter-hard image drawable spikes spike-length iterations)
    
	
	(cond ((not (defined? 'plug-in-gmic))
    (let (handler (car (gimp-message-get-handler)))	
	(gimp-message-set-handler 0) ;{ MESSAGE-BOX (0), CONSOLE (1), ERROR-CONSOLE (2) }
	(gimp-message "You will need to Install\nthe Plugin Gmic to use this script\nto Install Gmic go to this Link\nhttp://sourceforge.net/projects/gmic/files/")
	(gimp-message-set-handler handler)))
	(else
	(gimp-image-undo-group-start image)

 (let* (
        (spikes (truncate spikes))
		(spikes (cond ((> spikes 10) 10)
		              ((< spikes 2) 2)
					  ((= spikes 3) 4)
					  ((= spikes 5) 6)
					  ((= spikes 7) 8)
					  ((= spikes 9) 10)
					  (else spikes)))
		
		(spike-angle (/ 360 spikes))
		(initial-angle (/ spike-angle 2))
		(set-angle (+ initial-angle spike-angle)) 
		(layer 0)
		(cnt 0)
		(copy 0)
		)
	(set! layer (car (gimp-layer-copy drawable TRUE)))
	(include-layer image layer drawable 0)	;stack 0=above 1=below
	(gimp-layer-set-mode layer SCREEN-MODE)
	(gimp-drawable-set-name layer (string-append "layer" (number->string initial-angle)))
	(gimp-levels layer HISTOGRAM-VALUE 132 255 0.10 0 255)
	
	(let loop ((cnt (- spikes 1)))
           (unless (zero? cnt)
             (let ((copy (car (gimp-layer-copy layer TRUE))))
               (include-layer image copy layer 1)	;stack 0=above 1=below			   
               (gimp-layer-set-mode copy SCREEN-MODE)
			   (gimp-drawable-set-name copy (string-append "layer" (number->string set-angle)))
			   ;; Render [G'MIC] Blur [linear]
				(plug-in-gmic 1 image copy 1
					(string-append
						"-v - " ; To have a silent output. Remove it to display errors from the G'MIC interpreter on stderr.
						"-gimp_blur_linear "
					    (number->string spike-length) ",0.5,"
						(number->string set-angle) ",173,1,0,0,0"))
			   (set! set-angle (+ set-angle spike-angle))
               (loop (- cnt 1)))))
	
	(gimp-image-set-active-layer image layer)
	;; Render [G'MIC] Blur [linear]
				(plug-in-gmic 1 image layer 1
					(string-append
						"-v - " ; To have a silent output. Remove it to display errors from the G'MIC interpreter on stderr.
						"-gimp_blur_linear "
					    (number->string spike-length) ",0.5,"
						(number->string initial-angle) ",173,1,0,0,0"))
    
	(let loop ((cnt (- spikes 1)))
           (unless (zero? cnt)
            (set! layer (car (gimp-image-merge-down image layer EXPAND-AS-NECESSARY)))
            (gimp-layer-set-mode layer SCREEN-MODE)
               (loop (- cnt 1))))
			   
	(gimp-layer-set-mode layer SCREEN-MODE)
	(gimp-levels layer HISTOGRAM-VALUE 0 255 1.07 0 255)

	(set! cnt (- iterations 1))
	(while (> cnt 0)
	(set! copy (car (gimp-layer-copy layer TRUE)))
	(gimp-image-add-layer image copy -1)
	(set! layer (car (gimp-image-merge-down image copy EXPAND-AS-NECESSARY)))
	(gimp-layer-set-mode layer SCREEN-MODE)
	(set! cnt (- cnt 1)))
	
	(gimp-layer-set-mode layer SCREEN-MODE)
	(gimp-drawable-set-name layer "Star Effect")
	(gimp-drawable-set-visible drawable TRUE)	
	
	(gimp-displays-flush)
	(gimp-image-undo-group-end image)
	)
	))
)
(script-fu-register "script-fu-star-effect-filter-hard"        		    
  "Star Effect Hard"
  "Uses Gmic to generate diffraction spikes (star spikes)"
  "Graechan"
  "Graechan - http://gimpchat.com"
  "Jan 2015"
  "RGB*"
  SF-IMAGE      "image"      0
  SF-DRAWABLE   "drawable"   0
  SF-ADJUSTMENT "Spikes (use even numbers only)" '(4 2 10 2 2 0 1)
  SF-ADJUSTMENT "Spike Length" '(50 0 100 1 10 0 0)
  SF-ADJUSTMENT "Iterations" '(1 1 10 1 1 0 0)
)

(script-fu-menu-register "script-fu-star-effect-filter-hard" "<Image>/Filters/Light and Shadow/Star Effect Filter/")
;
(define (script-fu-star-effect-filter-soft image drawable spikes spike-length iterations)
    
	(gimp-image-undo-group-start image)

 (let* (
        (spikes (truncate spikes))
		(spike-angle (/ 360 spikes))
		(initial-angle (/ spike-angle 2))
		(set-angle (+ initial-angle spike-angle)) 
		(layer 0)
		(cnt 0)
		(copy 0)
		(center-x (/ (car (gimp-drawable-width drawable)) 2))
		(center-y (/ (car (gimp-drawable-height drawable)) 2))
		)	
	(set! layer (car (gimp-layer-copy drawable TRUE)))
	(include-layer image layer drawable 0)	;stack 0=above 1=below
	(gimp-layer-set-mode layer SCREEN-MODE)
	(gimp-drawable-set-name layer (string-append "layer" (number->string initial-angle)))
	(gimp-levels layer HISTOGRAM-VALUE 127 255 0.10 0 255)

    (let loop ((cnt (- spikes 1)))
           (unless (zero? cnt)
             (let ((copy (car (gimp-layer-copy layer TRUE))))
               (include-layer image copy layer 1)	;stack 0=above 1=below			   
               (gimp-layer-set-mode copy SCREEN-MODE)
			   (gimp-drawable-set-name copy (string-append "layer" (number->string set-angle)))
			   (plug-in-mblur 1 image copy LINEAR spike-length set-angle center-x center-y)
			   (set! set-angle (+ set-angle spike-angle))
               (loop (- cnt 1)))))	

	(gimp-image-set-active-layer image layer)
	(plug-in-mblur 1 image layer LINEAR spike-length initial-angle center-x center-y)

	(let loop ((cnt (- spikes 1)))
           (unless (zero? cnt)
            (set! layer (car (gimp-image-merge-down image layer EXPAND-AS-NECESSARY)))
            (gimp-layer-set-mode layer SCREEN-MODE)
               (loop (- cnt 1))))

	(gimp-levels layer HISTOGRAM-VALUE 0 255 1.07 0 255)
   
	(set! cnt (- iterations 1))
	(while (> cnt 0)
	(set! copy (car (gimp-layer-copy layer TRUE)))
	(gimp-image-add-layer image copy -1)
	(set! layer (car (gimp-image-merge-down image copy EXPAND-AS-NECESSARY)))
	(gimp-layer-set-mode layer SCREEN-MODE)
	(set! cnt (- cnt 1)))
	
	(gimp-layer-set-mode layer SCREEN-MODE)
	(gimp-drawable-set-name layer "Star Effect")

	(gimp-displays-flush)
	(gimp-image-undo-group-end image)
 )	
)
(script-fu-register "script-fu-star-effect-filter-soft"        		    
  "Star Effect Soft"
  "Generates Soft diffraction spikes (star spikes)"
  "Graechan"
  "Graechan - http://gimpchat.com"
  "Jan 2015"
  "RGB*"
  SF-IMAGE      "image"      0
  SF-DRAWABLE   "drawable"   0
  SF-ADJUSTMENT "Spikes" '(4 1 10 1 1 0 1)
  SF-ADJUSTMENT "Spike Length" '(100 1 256 1 10 0 0)
  SF-ADJUSTMENT "Iterations" '(1 1 10 1 1 0 0)
)

(script-fu-menu-register "script-fu-star-effect-filter-soft" "<Image>/Filters/Light and Shadow/Star Effect Filter/")

