GIMP Script-fu

Artifact Content
Login

Artifact 1798e8830fef11e639d5fe89eda4c0927d542d8c:


; 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 2 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.

; Scales the layer to match the selection size while maintaining
; original aspect ration. If no selection is present, scales 
; layer to image size. Note: if the layer is floated (for example,
; after an Edit->Paste has been performed) there is no selection
; present even though there are marching ants around the originally
; selected region -- if this script is run without first making
; a new selection then the floating selection will be scaled to
; the image size. 

(define (script-fu-sg-layer-fit-in-selection image drawable)
  (let* (
      (layer (car (gimp-image-get-active-layer image)))
      (bounds (cdr (gimp-selection-bounds image)))
      (x (car bounds))
      (y (cadr bounds))
      (width (- (caddr bounds) x))
      (height (- (cadddr bounds) y))
      (layer-width (car (gimp-drawable-width layer)))
      (layer-height (car (gimp-drawable-height layer)))
      (aspect (/ layer-height layer-width))
      )
    (gimp-image-undo-group-start image)
    (gimp-layer-add-alpha layer)
    (if (< (/ width layer-width) (/ height layer-height))
      (begin
        (gimp-layer-scale-full layer 
                               width
                               (* width aspect)
                               TRUE 
                               INTERPOLATION-LANCZOS)
        (gimp-layer-set-offsets layer x (+ y (/ (- height (* width aspect)) 2) ))
        )                          
      (begin 
        (gimp-layer-scale-full layer 
                               (/ height aspect)
                               height
                               TRUE 
                               INTERPOLATION-LANCZOS)
        (gimp-layer-set-offsets layer (+ x (/ (- width (/ height aspect)) 2)) y)
        )
      )
    (gimp-image-undo-group-end image)
    (gimp-displays-flush)
    )
  )

(script-fu-register "script-fu-sg-layer-fit-in-selection"
 "Fit within Selection"
 "Scale the active layer so it fits in the selected region"
 "Saul Goode"
 "Saul Goode"
 "10/25/2010"
 "RGB*,GRAY*"
 SF-IMAGE    "Image"    0
 SF-DRAWABLE "Drawable" 0
 )

(script-fu-menu-register "script-fu-sg-layer-fit-in-selection"
 "<Image>/Layer/Resize"
 )