; 210_effects_reflection.scm ; last modified/tested by Paul Sherman [gimphelp.org] ; Thursday, 07/02/2020 on GIMP 2.10.20 ;================================================== ; ; Installation: ; This script should be placed in the user or system-wide script folder. ; ; Windows 7/10 ; C:\Program Files\GIMP 2\share\gimp\2.0\scripts ; or ; C:\Users\YOUR-NAME\AppData\Roaming\GIMP\2.10\scripts ; ; ; Linux ; /home/yourname/.config/GIMP/2.10/scripts ; or ; Linux system-wide ; /usr/share/gimp/2.0/scripts ; ;================================================== ; ; LICENSE ; ; 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, see . ; ;============================================================== ; Original information ; ; Copyright (C) 2005-2007 Otavio Correa Cordeiro (otavio gmail com) ; Create a reflection effect like Apple iWeb does.. ; ; modified by Paul Sherman to work in GIMP 2.4.2 on 11/30/2007 ; ; modified by David Cummins and Paul Sherman Dec 2007, tested on GIMP-2.4.3 ; * added user settings to control the height of the generated reflection, ; the gradient mask starting point (presented as Fade Rate %), and options ; to keep the generated reflection as a separate layer, or on a single layer ; either transparent or flattened. ; * added code to "play nice" with the current GIMP environment: colors and ; gradient prior selections are preserved, as well as the original layer ; name (handled using careful stack order). ; generated layers are constrained around the original layer. ; * simplified some of the internal logic so repeated calculations are done ; only once, reformatted, organised the code, added comments, etc. ; * flattened on start (to avoid errors) ; * undo ability functional ; ; Wed Oct 1 22:14:40 EDT 2008 ; Modified to remove deprecated procedures as listed: ; gimp-flip ==> gimp-drawable-transform-flip-simple ; added extra parameters ; also flushed before undo-end ;============================================================== (define (draw-line layer x-from y-from x-to y-to) (let* ( (points (cons-array 4 'double)) ) (aset points 0 x-from) (aset points 1 y-from) (aset points 2 x-to ) (aset points 3 y-to ) (gimp-pencil layer 4 points) ) ) (define (210-gimp-reflection theImage theLayer userHeight userFade new_layer transparentBG make_line ) (define originalWidth (car (gimp-image-width theImage))) (define originalHeight (car (gimp-image-height theImage))) (gimp-image-undo-group-start theImage) (if (not (= RGB (car (gimp-image-base-type theImage)))) (gimp-image-convert-rgb theImage)) ; (gimp-selection-all theImage) (gimp-selection-none theImage) (set! theLayer (car(gimp-image-merge-visible-layers theImage 0))) (if (= make_line TRUE) (begin (gimp-context-set-background '(255 255 255)) (gimp-context-set-foreground '(000 000 000)) (gimp-context-set-brush "Circle (03)" ) (draw-line theLayer 0 originalHeight originalWidth originalHeight) )) ;preserve original settings (define old-bg (car (gimp-context-get-background))) (define old-fg (car (gimp-context-get-foreground))) (define old-grad (car (gimp-context-get-gradient))) ;calculate color for start of gradient fade (define fadeStart (* (- 100 userFade) 2.55)) (define fadeColor (list fadeStart fadeStart fadeStart)) (define reflectionScale (/ userHeight 100)) (define stackPos (car(gimp-image-get-item-position theImage theLayer))) (define newWidth originalWidth) (define newHeight (* originalHeight (+ reflectionScale 1))) (define gradX (/ originalWidth 2)) (define gradY1 (* originalHeight reflectionScale)) (define gradY2 (* originalHeight reflectionScale -1)) (gimp-image-resize theImage originalWidth newHeight 0 0) (define new-layer (car (gimp-layer-copy theLayer 1))) (gimp-image-insert-layer theImage new-layer 0 (+ stackPos 0)) (gimp-item-set-name new-layer "Reflection") (gimp-layer-set-offsets new-layer 0 originalHeight) (gimp-item-transform-flip-simple new-layer ORIENTATION-VERTICAL TRUE 0.0) (define new-mask (car (gimp-layer-create-mask new-layer 0))) (gimp-layer-add-mask new-layer new-mask) (gimp-context-set-foreground fadeColor) (gimp-edit-blend new-mask FG-TRANSPARENT-MODE LAYER-MODE-NORMAL-LEGACY GRADIENT-LINEAR 100 0 REPEAT-NONE FALSE FALSE 0 0 TRUE gradX gradY1 gradX gradY2) (if (= new_layer FALSE) (begin (if (= transparentBG TRUE) (begin ;# NO separate layer, transparent ############## (gimp-image-merge-visible-layers theImage 1) ) (begin ;# NO separate layer, NOT transparent ########## (gimp-image-flatten theImage) ) ) ; final crop not needed for new_layer FALSE ) (begin (if (= transparentBG TRUE) (begin ;# separate layer, transparent ############### (gimp-image-set-active-layer theImage new-layer) ) (begin ;# separate layer, NOT transparent ########### (define bg-layer (car(gimp-layer-new theImage originalWidth newHeight 0 "Reflection BG" 100 0))) (gimp-image-insert-layer theImage bg-layer 0 (+ stackPos 2)) (gimp-selection-all theImage) (gimp-edit-bucket-fill bg-layer 1 0 100 255 0 1 1) (gimp-selection-none theImage) (gimp-image-set-active-layer theImage new-layer) ) ) ; the Reflection layer still overflows the image here (gimp-image-crop theImage originalWidth newHeight 0 0) ) ) ;restore original settings (gimp-context-set-foreground old-fg) (gimp-context-set-background old-bg) (gimp-context-set-gradient old-grad) (gimp-displays-flush) (gimp-image-undo-group-end theImage) ) (script-fu-register "210-gimp-reflection" "Reflection" "Reflection -- extends lower section of an image as a reflection of the original image." "Original author Otavio Cordeiro, later edited by David Cummins and Paul Sherman" "Paul Sherman " "Last updated 12/19/2007 - tested on GIMP-2.4.3" "*" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-ADJUSTMENT "Reflection Height (% of original)" '( 40 10 99 1 20 0 0) SF-ADJUSTMENT "Fade Rate (%)" '(60 0 100 10 20 0 0) SF-TOGGLE "Keep Reflection as a separate Layer" FALSE SF-TOGGLE "Transparent Background" TRUE SF-TOGGLE "Include a Separator Line?" TRUE ) (script-fu-menu-register "210-gimp-reflection" "/Script-Fu/Effects")