Programmez un Tetris en Java 360 pages PDF pour apprendre à votre rythme. Développez des jeux vidéo en Java. www.jdevmaker.com |
Ce document est sous un contrat Creative Commons.
Nous allons voir les conditions en améliorant notre script, mais avant remédions a un petit inconvénient
Pour rappel voici l'état actuel de notre script :
10 (define (script-fu-filtre-couleur image drawable couleur) ;; declaration de la fonction
20 (gimp-image-undo-group-start img) ;; début d'historique d'annulation
30 (let*
35 (
37 (old-color (car (gimp-palette-get-foreground)))
40 (width (car (gimp-image-width img)))
45 (height (car (gimp-image-height img)))
50 (new-layer (car (gimp-layer-new img width height RGBA-IMAGE "Nom du calque" 100 COLOR)))
55 )
57 (gimp-desaturate drawable)
60 (gimp-edit-clear new-layer)
70 (gimp-image-add-layer img new-layer -1)
71 (gimp-palette-set-foreground couleur)
73 (gimp-edit-fill new-layer 0)
74 (gimp-palette-set-foreground old-color)
75 );; fin du let
77 (gimp-displays-flush)
80 (gimp-image-undo-group-end img) ;; fin d'historique d'annulation
90 ) ;; fin de la fonction
100 (script-fu-register "script-fu-filtre-couleur" ;; nom du script
110 "<Image>/Script-Fu/Filtre couleur" ;; position du script dans le menu
120 "Cree un calque filtre de couleur" ;; commentaires
130 "Auteur" ;; auteur
140 "Copyright" ;; copyright
150 "Date" ;; date
160 "RGB*" ;; types d'images supportés par le script
170 SF-IMAGE "Image" 0 ;; image dans lequel le calque est ajouté
180 SF-DRAWABLE "Drawable" 0 ;; calque actif de l'image
185 SF-COLOR "Couleur" '(255 0 0)
190 ) ;; fin du register
Ouvrez une image, faite une sélection telle que vous la voulez, peu importe. Puis utilisez le script.
Eh oui, encore les "parasites" !
Pourquoi ? C'est simple : puisqu'une sélection a été faite, notre ligne 60, qui sert a effacer ces "parasites", n'efface que ce qu'il y a à l'intérieur de la sélection, pas à l'extérieur.
Nous allons avant la ligne 60, effectuer une inversion de la sélection, de sorte que l'on efface l'extérieur de celle-ci. Peu importe que les parasites demeurent à l'intérieur, puisque l'on va remplir la sélection. Dans le cas où aucune sélection n'a été faite, l'inversion ne posera pas de problème. Après que nous aurons effacer l'extérieur de cette sélection, il nous faudra l'inverser de nouveau, de manière à remplir la sélection, et non l'extérieur.
La procédure gimp-selection-invert est faite pour cette situation. Elle permet d'inverser la sélection. Il suffit d'indiquer l'image sur laquelle nous voulons effectuer cette tâche (une sélection n'a pas de calque spécifique, cela dépend du calque actif).
Insérez une ligne 59 et 61 contenant :
(gimp-selection-invert img)
Notre problème est résolu !
Nous allons maintenant, offrir la possibilité à l'utilisateur de choisir si ce calque de couleur doit-être fusionné ou non à l'image.
Il nous faut donc un nouveau paramètre, nous permettant de savoir si OUI ou NON il faut fusionner le calque. En ligne 187 :
SF-TOGGLE "Fusionner le calque ?" FALSE
Ce paramètre nous renverra une valeur binaire, c'est à dire avec seulement 2 valeurs différentes possible : TRUE (vrai, oui) ou FALSE (faux, non). Par défaut, nous disons ici que la valeur sera fausse.
Nous allons utiliser une variable fusion afin de recueillir l'information. Modifiez la ligne 10 ainsi :
(define (script-fu-filtre-couleur image drawable couleur fusion)
La procédure pour fusionner un calque est gimp-image-merge-down, il faut précisez l'image sur laquelle on veut travailler, le calque et une valeur définissant le type de fusion.
Il va maintenant falloir tester cette valeur afin de savoir ce que l'utilisateur à choisit. C'est ce que vont nous permettre l'utilisation des conditions en Scheme. C'est comme dans la vie.
1. Une condition simple :
Si j'ai le temps, alors j'irais au bois. Sous entendu si je n'ai pas le temps, je n'irais pas.
La condition est ici positive "si j'ai", et la forme négative "si je n'ai PAS" est sous-entendu.
2. Mais nous pouvons formuler notre condition négative de manière explicite :
Si j'ai le temps, alors j'irais au bois. Si je n'ai pas le temps, alors je regarderais la télé.
Si on a pas le temps non seulement on ne va pas au bois, mais on regarde la télé, ce qui n'était pas sous entendu dans la forme précédente. C'est pareil en Scheme.
La forme sous laquelle nous pouvons testez cela est :
(if ([condition]) [tâche]) ;; exécute la tâche si la condition est vrai
ou
(if ([condition]) ;; teste la condition
(begin ([tâche(s)]) ;; la condition est vrai, exécute la tâche(s)
)
)
ou encore
(if ([condition]) ;; teste la condition
(begin ([tâche(s)]) ;; la condition est vrai, exécute la tâche(s)
)
(begin ([tâche(s)]) ;; la condition est fausse, exécute la tâche(s)
)
)
Nous voulons : Si la variable fusion est vrai alors fusionner le calque (ce qui sous entend de ne rien faire dans le cas contraire).
La condition s'écrit sous la forme (= [variable] [valeur]) soit :
(= fusion TRUE)
Cela donne :
(if (= fusion TRUE) (gimp-image-merge-down img new-layer 0))
Si fusion = TRUE alors (gimp-image-merge-down img new-layer 0), dans le cas contraire on ne fait rien, le calque est laissé.
Décalez la ligne 75 en 76, afin de pouvoir insérer une nouvelle ligne 75 :
(if (= fusion TRUE) (gimp-image-merge-down img new-layer 1))
Ce qui nous donne :
10 (define (script-fu-filtre-couleur image drawable couleur fusion) ;; declaration de la fonction
20 (gimp-image-undo-group-start img) ;; début d'historique d'annulation
30 (let*
35 (
37 (old-color (car (gimp-palette-get-foreground)))
40 (width (car (gimp-image-width img)))
45 (height (car (gimp-image-height img)))
50 (new-layer (car (gimp-layer-new img width height RGBA-IMAGE "Nom du calque" 100 COLOR)))
55 )
57 (gimp-desaturate drawable)
59 (gimp-selection-invert img)
60 (gimp-edit-clear new-layer)
61 (gimp-selection-invert img)
70 (gimp-image-add-layer img new-layer -1)
71 (gimp-palette-set-foreground couleur)
73 (gimp-edit-fill new-layer 0)
74 (gimp-palette-set-foreground old-color)
75 (if (= fusion TRUE) (gimp-image-merge-down img new-layer 0))
76 );; fin du let
77 (gimp-displays-flush)
80 (gimp-image-undo-group-end img) ;; fin d'historique d'annulation
90 ) ;; fin de la fonction
100 (script-fu-register "script-fu-filtre-couleur" ;; nom du script
110 "<Image>/Script-Fu/Filtre couleur" ;; position du script dans le menu
120 "Cree un calque filtre de couleur" ;; commentaires
130 "Auteur" ;; auteur
140 "Copyright" ;; copyright
150 "Date" ;; date
160 "RGB*" ;; types d'images supportés par le script
170 SF-IMAGE "Image" 0 ;; image dans lequel le calque est ajouté
180 SF-DRAWABLE "Drawable" 0 ;; calque actif de l'image
185 SF-COLOR "Couleur" '(255 0 0)
187 SF-TOGGLE "Fusionner le calque ?" FALSE
190 ) ;; fin du register
Voici d'autres illustrations concrètes qui n'ont rien à voir avec notre script. Testez les !
Ce script test si le calque actif possède un masque de sélection, et affiche la réponse dans la console. Pour le tester, créez 2 calques, l'un avec un masque et l'autre sans. Lancez le script sur chacun d'entre eux.
(define (script-fu-exemple img drw)
(if (= (car (gimp-drawable-is-layer-mask drw)) 0)
(begin (gimp-message "valeur=0 le drawable n'est pas un mask"))
(begin (gimp-message "Valeur<>0 c'est un mask"))
)
)
(script-fu-register "script-fu-exemple"
"<Image>/Script-Fu/exemple"
""
""
""
""
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
)
Cet autre script test si l'image a une sélection ou non, et affiche la réponse dans la console. Pour le tester, créez une nouvelle image, puis lancez le script. Ensuite faites une sélection avec un des outils disponible et relancez le script.
(define (script-fu-exemple image drawable)
(if (= (car (gimp-selection-is-empty image)) TRUE)
(begin (gimp-message "non, pas de selection"))
(begin (gimp-message "oui, il y a selection"))
)
)
(script-fu-register "script-fu-exemple"
"<Image>/Script-Fu/exemple"
""
""
""
""
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
)