Script-fu
Skript-fu je skript v jazyku scheme napísaný pre GIMP s určitou podobou.
Účel
Existujú dva typy skriptov. Také, ktoré potrebujú k svojmu fungovaniu otvorený obrázok a tie ostatné.
Preto sú dve miesta, kde sa vyskytujú:
"<Toolbox>/Xtns/Script-Fu/"- hlavné menu, tu sú skripty, ktoré nepotrebujú k činnosti otvorený obrázok."<Image>/Script-Fu/","<Image>/Filters/", ... - menu, ktoré sa objavý po kliknutí pravím tlačidlom myši do oblasti aktívneho obrázku.
Prvý skript
Skript je napísaný v jazyku scheme, uložený do textového súboru s koncovkou .scm a vložený do adresára
zapísaného v zozname adresárov, v ktorých GIMP
vyhľadáva skripty (treba pozrieť nastavenia programu). Predpokladám, že ste si už pozreli úvod do jazyka
scheme, je to nevyhnutné. Avšak, ako je zjavné, neboli popísané spôsoby ako môže program komunikovať s
okolím. To je dosť závažná vec, pretože tak by bol jazyk úplne nepoužiteľný. Našťastie interpreter jazyka
scheme (TinyScheme SIOD), ktorý je integrovaný v Gimpe priamo má
možnosť ponúknuť nám množstvo funkcií, vďaka ktorým túto interaktivitu môžme zabezpečiť.
Všetky plug-in-y a skripty sú prístupné ako funkcie so
vstupnými parametrami a taktiež výstupnými. Databáza týchto funkcií sa dá prehliadať cez tzv. Procedure Browser
("<Image>/Help/Procedure Browser" ),
v skorších časoch to bol DB Browser, . Tu sú funkcie zoradené
podľa mena, k nim je popis parametrov, návratové hodnoty - ak ich je viac vracia sa list!
- a nejaký popis. Je dobré si tento prehliadač obľúbiť. "<Toolbox>/Xtns/Procedure Browser"
A ešte jedna smrteľne dôležitá vec, neviem
prečo, ale mená funkcií sú v Procedure Browser napísané v tvare meno_meno2_... (s podtržítkami),
avšak keď ich budete volať musíte ich napísať v tvare meno-meno2-... (s pomlčkami).
Tak, to by sme mohli robiť už takmer čokolvek. Ale náš skript ešte musí mať určitú podobu. Bude sa skladať z jednej alebo viac definícií funkcií a zavolania dvoch špecifických funkcií. Jedna funkcia, ktorú definujeme bude hlavná, bude vstupom do programu. Nie sú na ňu kladené žiadne požiadavky, ale zo slušnosti programátora dodržujte túto zásadu: Názov funkcie je len malými písmenami, ak je viac slovný slová sú oddelené pomlčkou: "-", a navyše názov hlavnej funkcie začína na "script-fu-" + meno, je to preto aby bol v databázy pekne zaradený podľa abecedy medzi skriptami.
Tie spomínané dve funkcie, ktoré treba volať sú script-fu-register a script-fu-menu-register. Voláme ich až na konci súboru a ich úlohou je správne zaradiť skript do programu (miesto, názov, hlavná funkcia, autor atd.)
Všeobecná podoba skriptu teda je:
(define (script-fu-meno parametre)
(let* (
(lokalna_premenna hodnota)
)
;telo skriptu
)
)
(script-fu-register
"script-fu-meno" ;meno hlavnej "main" funkcie
"Meno" ;meno skriptu
"Kratky popis." ;opis
"Jozef Sivek" ;meno autora
"2003-2005" ;copyright
"august 2005" ;datum napisania
"RGB" ;typ obrazku, na ktorom skript funguje
;mozne hodnoty su "RGB", "RGBA", "GRAY", "GRAYA", "INDEXED", "INDEXEDA"
;ak ich je viac su oddelene medzerou
;tieto parametre (vrchne) su povinne!
;[vstupne parametre pre skript napisem neskuor]
)
(script-fu-menu-register:
"script-fu-meno" ;meno hlavnej "main" funkcie
"<Image>/Script-Fu/My/" ;zaradenie skriptu, muoze byt aj ine
)
Väčšina prametrov by mala byť jasná, odovzdávajú sa ako string-i, a tie čo som napísal sú povinné. Čo sa týka typu obrázku, ak odovzdáme prázdny string, skript bude pracovať so všetkými typmi obrázkov, akšak ak špecifikujem napr. "RGB RGBA" tak pri otvorenom indexovanom obrázku sa skript nebude dať pustiť.
Vo výpise je jeden riadok: [vstupne parametre pre skript], na jeho mieste dáme ešte ďalsie parametre, ktoré povedia aké
vstupné hodnoty skript potrebuje. Počet SF-* musí byť zhodný s počtom parametrov, ktoré má hlavná funkcia (treba dávať
pozor na typ a poradie). Najlepšie je ak si otvoríte nejaký skript a ten si pozriete. Tie možné parametre teraz vypíšem
(všetky druhy, každý po jednom, začínajúci sa príkazom SF-*, potom je meno a počiatočná hodnota, meno je len popis,
ktorý uvidíte v GUI):
SF-IMAGE "" 0 ;vrati aktualny obrazok, v GUI skriptu sa nezobrazi
SF-DRAWABLE "" 0 ;vrati aktualne drawable, v GUI skriptu sa nezobrazi
SF-VALUE _"meno" "45" alebo "\"string\"" ;string alebo cislo, nepouzivajte, string musi byt este v "", teda "\"string\""
SF-COLOR _"meno" '(54 ff 0) ;vyber farby a jej pociatocna hodnota
SF-TOGGLE _"meno" TRUE/FALSE ;zaskrtavatko - checkbox
SF-ADJUSTMENT _"meno" '(init buttom top step 0/1 pocet_desatinych_miest 0/1[1 nezobrazi slider]) ;slider...
SF-STRING _"meno" "init value" ;text
SF-FONT _"meno" "meno_fontu" ;vyber fontu
SF-FILENAME _"meno" "path" ;vyber suboru
SF-OPTION _"meno" '("opt1" "opt2" ... "optlast") ;moznosti, ako list
SF-BRUSH _"meno" '("Circle (01)" 1.0 -1 0) ;vyber stetca
SF-GRADIENT _"meno" "meno_gradientu" ;vyber gradientu
- SF-IMAGE
- program prostredníctvom SF-IMAGE vráti premennú zastupujúcu aktuálny obrázok.
- SF-DRAWABLE
- program prostredníctvom SF-DRAWABLE vráti premennú zastupujúcu aktuálny drawable. Drawable môže byť buť vrstva alebo kanál - je to niečo, kde sa dá kresliť. Filozofia Gimpu je asi taká, že existuje obrázok, ktorý funguje ako obal, do obrázka sa nedá kresliť. Ale obrázok obsahuje tzv. drawable ču sú vrstvy a kanály, do ktorých sa už kresliť dá. Každý obrázok a drawable má špecifiské ID (je to číslo), ktoré ho zastupuje.
- SF-VALUE
- je to zastaralé a ostatné vstupy ho dokážu nahradiť.
Viem, že to nemusí byť celkom jasné, takže ako pomôcka môže byť spustiť si v Gimpe nejaký skript, nehať zobrazené jeho
GUI a paralelne k tomu si vyhľadať niekde v koreňovom adresáry Gimpu jeho
zdrojový kód a porovnať, ako ovplivňuje "to" SF-* to čo vidíme ako polia pre zadávanie vstupných hodnôt pre skript. Tiež
je si dobré pozrieť, napr. aj na mojich skriptoch aké sú SF-* hodnoty a aké sú vstupné parametre našej hlavnej funkcie.
Je si to treba nehať uležať v hlave, nie je to ťažké ale ťažšie sa to vysvetluje.
Na čo nezabudnúť
Existuje pár vecí, ktoré sa velmi často používajú, z toho dôvodu ich vypíšem:
- Cyklus
- Ak chceme urobiť cyklus s pevným počtom opakovaní:
(let* ((i 0)) (while (< i max) ; body of cycle (set! i (+ i 1)) ) )
- Undo
- Aby užívateľ mal možnosť vrátiť zmeny, ktoré skript potencionálne na obrázku
urobil tak sa pred a za jednotlivé volania funkcií, ktoré upravujú brázok zavolajú
funkcie
(gimp-image-undo-group-start inImage)a(gimp-image-undo-group-end inImage)(inImageje premenná zastupujúca obrázok, ktorého sa to týka). Sú párové a to čo uzatvoria sa do histórie zmien uloží ako jedna zmena. Teda:(gimp-image-undo-group-start inImage) ; blok, ktorý (gimp-image...) ; sa dá vrátiť (gimp-image-undo-group-end inImage) ; pomocou Ctrl+Z - Na konci skriptu
- Ako posledná funkcia v tele skriptu sa zvykne volať bezparametrová funkcia:
(gimp-displays-flush). Ak som ju správne pochopil má za úlohu naše zmeny zobraziť. - remove dirty flag / odstránenie značky o zmene
- dirty flag je značka v obrázku, ktorá hovorí či na ňom boli urobené zmeny.
Vďaka nej ak sa pokúsime zavrieť obrázok po zmene sa nás GIMP spýta,
či tieto zmeny nechceme uložiť. V prípade obrázka, ktorý vygeneroval skript
môžme túto značku vymazať pomocou:
(gimp-image-clean-all theImage), a tak zbytočne neskomplikovať zatvorenie ak sa užívateľovi výsledok napr. nepáči.
K záveru
Mojim cieľom bolo hlavne zhrnúť gramatiku písanie skriptov pre GIMP . Výbornou metódou ako pozisťovať o jednotlivých funkciách z Procedure Browser viac je ich zavolať zo Script-fu Console a vrelo odporúčam s tým experimentovať. Príklady skriptov sa dajú nájsť v oficiálnom help-e pre GIMP, každopádne dá sa veľa naučiť aj z príkladov a v každom Gimpe je predinštalovaných okolo sto skriptov!