[Part I. GIMP基礎功]

[Part II. 一種效果的誕生]
[Part III. Script-Fu的秘密]

22.8 單步執行的「第二種方式」與「第三種方式」

單行可執行的程式碼,很適合用於學習 Script-Fu 與 Python-Fu
三種單步執行程式的方式
  • 第一種方式:只修改註冊於PDB內的函數名稱
  • 第二種方式:修改成在 Console 內可一行一行執行的 Scheme 程式碼
  • 第三種方式:修改成在 Console 內可一行一行執行的 Python 程式碼


本節介紹「第二種方式」,以 news-text.scm 為例
  • 本節介紹單步執行的「第二種方式」,可「單行」執行的 Scheme code 。
  • news-text.scm 完整的程式碼可參考 22.5 節
  • 也可到 GIMP 系統的 scripts 目錄下找到該檔案。
  • 最主要修改的部份是,將「對話框接收輸入變數值」修改成「直接指定輸入變數值」。
  • 先要瞭解,news-text.scm 程式碼的執行流程。


不使用 let* 改用 define
  • 原本的程式使用 let* 定義與指定區域變數值。
  • (let* (()()()...) ()() ...) 這樣的語法括號太多。
  • 若要一行一行分析程式碼的意義,let* 語法,括號有好幾層,分析時,會造成一些干擾。
  • 現在不使用 let* 改用 define 來定義與指定變數值。


如何用人工的方式判斷,左右括號對齊
  • 心中有個計數器,一開始為 0 。
  • 從左至右掃描程式碼,在心中默數。
  • 看到左括號 ( 加 1 。
  • 看到右括號 ) 減 1 。
  • 掃描完,若復歸為 0 ,則表示左右括號在數量上是對齊的。
  • 掃描的過程中,計數器值若為負值 ,則表示此時右括號多於左括號 ,這是也是不合理的。

  • news-text.scm 以這一行 Scheme code 為例

(define grey (/ (* density 255) 100))
1            2  3             2   1 0

  • news-text.scm 之中,下面這一行應該是最複雜的。
  • 讀者可自行練習,判斷括號對齊與否。

(gimp-floating-sel-anchor
(car (gimp-text-fontname img text-layer
(/ (+ 20 blur-radius) 2) (/ (+ 20 blur-radius) 2)
string 0 TRUE font-size PIXELS font)))


捨棄函數 script-fu-newsprint-text,直接指定輸入變數值
  • 修改成最多的地方就是下列的這部份。
  • 修改後的程式碼,不再需要預先定義函數 script-fu-newsprint-text ,但是要預先設定變數名稱、變數值 。
(define (script-fu-newsprint-text string font font-size cell-size density blur-radius text-color bg-color)
(let* (
(text-ext ......)
(width ......)
(height ......)
(img ......)
(bg-layer .....)
(text-layer ......)
(text-mask ......)
(grey .....)
)

  • 從下列的程式碼得知變數值的型態與大小 。

SF-STRING _"Text" "Newsprint"
SF-FONT _"Font" "Sans"
SF-ADJUSTMENT _"Font size (pixels)" '(100 2 1000 1 10 0 1)
SF-ADJUSTMENT _"Cell size (pixels)" '(7 1 100 1 10 0 1)
SF-ADJUSTMENT _"Density (%)" '(60 0 100 1 10 0 0)
SF-ADJUSTMENT _"Blur radius" '(0 0 100 1 5 0 0)
SF-COLOR _"Text color" "black"
SF-COLOR _"Background color" "white"