13.6. Mở rộng tập lệnh Text Box

Quản lý quay ngược lệnh một cách đúng đắn

Khi tạo ra một tập lệnh, bạn muốn cho người dùng của mình có khả năng quay ngược lại các hành động của họ, khi họ phạm sai lầm. Điều này dễ dàng thực hiện được bằng cách gọi các hàm gimp-undo-push-group-startgimp-undo-push-group-end ở gần mã nào xử lý ảnh. Bạn có thể coi chúng như là các câu lệnh tương ứng (matched statement) nhằm báo cho GIMP biết khi nào bắt đầu và ngưng ghi nhận các xử lý trên ảnh, nhờ vậy các xử lý có thể quay ngược lại sau này.

Nếu bạn đang tạo ra một ảnh mới hoàn toàn, sử dụng các hàm trên chẳng có ý nghĩa gì vì bạn không thay đổi một ảnh đang có. Tuy nhiên, khi bạn thay đổi một ảnh hiện có, chắc chắn rằng bạn muốn sử dụng những hàm này.

Quay ngược lại một tập lệnh hoạt động một cách gần như hoàn hảo khi sử dụng những hàm này.

Mở rộng tập lệnh thêm một chút nữa

Bây giờ chúng ta đã có một tập lệnh "bảnh bao" để tạo các hộp chữ, chúng ta hãy thêm hai tính chất nữa cho nó:

  • Hiện tại, ảnh đã được điều chỉnh kích thước cho vừa khít với chữ, không còn chỗ cho bất kỳ thứ gì, như bóng đổ hoặc hiệu ứng đặc biệt (mặc dù nhiều tập lệnh sẽ tự động điều chỉnh lại kích thước ảnh khi cần thiết). Chúng ta hãy thêm một vùng đệm vào quanh chữ, và thậm chí hãy để cho người dùng của chúng ta chỉ định vùng đệm lớn bao nhiêu tính theo phần trăm kích thước của chữ tạo thành.

  • Tập lệnh này có thể được dễ dàng sử dụng chung với các tập lệnh khác làm việc với chữ. Hãy mở rộng nó sao cho nó trả về ảnh và các lớp, nhờ đó các tập lệnh khác có thể gọi tập lệnh này và sử dụng ảnh và các lớp mà chúng ta đã tạo ra.

Thay đổi các Tham số và Hàm đăng ký

Để cho phép người dùng chỉ định vùng đệm, chúng ta sẽ thêm một tham số vào hàm của chúng ta và hàm số đăng ký:

        (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
        (let*
              (
                 ; define our local variables
                 ; create a new image:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car 
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)          ;a declaration for the text
                                    ;we create later

                 (theBuffer)        ;added
                 (theLayer 
                           (car
                               (gimp-layer-new
                                theImage
                                theImageWidth
                                theImageHeight
                                RGB-IMAGE
                                "layer 1"
                                100
                                NORMAL
                               )
                           )
                 )
              ) ;end of our local variables

         [Code here]
       )
      

        (script-fu-register
          "script-fu-text-box"                        ;func name
          "Text Box"                                  ;menu label
          "Creates a simple text box, sized to fit\
            around the user's choice of text,\
            font, font size, and color."              ;description
          "Michael Terry"                             ;author
          "copyright 1997, Michael Terry"             ;copyright notice
          "October 27, 1997"                          ;date created
          ""                     ;image type that the script works on
          SF-STRING      "Text:"         "Text Box"   ;a string variable
          SF-FONT        "Font:"         "Charter"    ;a font variable
          SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                      ;a spin-button
          SF-COLOR       "Color:"        '(0 0 0)     ;color variable
          SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                      ;a slider
        )
        (script-fu-menu-register "script-fu-text-box" "<Toolbox>/Xtns/Script-Fu/Text")

      

Thêm mã mới

Chúng ta sắp sửa thêm mã vào hai chỗ: ngay phía trước chỗ chúng ta điều chỉnh lại kích thước của ảnh và ở phần cuối của tập lệnh (trả về kết quả là ảnh, lớp và chữ).

Sau khi đã có được chiều cao và chiều rộng của chữ, chúng ta cần phải thay đổi các giá trị này dựa trên mức độ đệm do người dùng chỉ định. Chúng ta sẽ không thực hiện việc kiểm tra lỗi để đảm bảo là nó ở trong khoảng 0-100% bởi vì chuyện này không đe dọa gì mạng sống của ai đó, và bởi vì không có lý do gì mà người dùng không được thêm một giá trị ví dụ như "200" cho phần đệm cần thêm vào.

        (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

        (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
        (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) ) 	
      

Tất cả những gì chúng ta đang làm ở đây là thiết lập vùng đệm dựa trên chiều cao của chữ, và thêm nó hai lần cho cả chiều cao và chiều rộng của ảnh. (Chúng ta thêm nó hai lần cho cả hai chiều bởi vì vùng đệm cần phải được thêm vào cả hai phía của chữ).

Bây giờ chúng ta đã thay đổi kích thước của ảnh cho phép tạo vùng đệm, chúng ta cần phải canh chữ ở ngay chính giữa của ảnh. Điều này được thực hiện bằng cách di chuyển nó đi một toạ độ (x,y) của (theBuffer, theBuffer). Tôi đã thêm dòng lệnh dưới đây sau khi đã thay đổi kích thước của lớp và ảnh:

        (gimp-layer-set-offsets theText theBuffer theBuffer)
      

Hãy tiến lên và lưu tập lệnh của bạn lại, và hãy thử nó sau khi làm tươi (refresh) lại cơ sở dữ liệu.

Tất cả những gì còn lại phải làm là trả về ảnh, lớp và lớp chữ. Sau khi hiển thị ảnh, chúng ta thêm vào dòng này:

        (list theImage theLayer theText)
      

Đây là dòng cuối cùng của hàm, hãy làm cho danh sách này khả dụng được với các tập lệnh nào muốn sử dụng nó.

Để sử dụng tập lệnh tạo hộp chữ mới của chúng ta trong một tập lệnh khác, chúng ta có thể viết một thứ gì đó tương tự như sau:

        (set! theResult (script-fu-text-box 
                         "Some text" 
                         "Charter" "30"
                         '(0 0 0)
                         "35"
                        )
        )
        (gimp-image-flatten (car theResult))   	
      

Xin chúc mừng, bạn đang trên con đường đoạt được "đai đen" về Script-Fu!