10-06-2017, 03:17 PM
There is a script called 'tile_shuffle.scm', and I want to edit it a little.
This script does not work with alpha channels. Is there any way to edit it to shuffle tiles with alpha values?
Here's the script:
This script does not work with alpha channels. Is there any way to edit it to shuffle tiles with alpha values?
Here's the script:
Code:
; tile_shuffle.scm
; by Rob Antonishen
; http://ffaat.pointclark.net
; Version 1.0 (20090118)
; Description
; Shuffles tiles of the image
; License:
;
; 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.
;
; The GNU Public License is available at
; http://www.gnu.org/copyleft/gpl.html
(define (script-fu-tile_shuffle img inLayer inX inY)
(let* (
(width (car (gimp-image-width img)))
(height (car (gimp-image-height img)))
(inX (min inX width))
(inY (min inY height))
(xTiles (trunc (/ width inX)))
(yTiles (trunc (/ height inY)))
(tile1 0)
(newlayer 0)
(x0 0)
(y0 0)
(x1 0)
(y1 0)
(counter 0)
(swap 0)
(temp 0)
(tilelist (cons-array (* xTiles yTiles) 'double))
(mode (car (gimp-layer-get-mode inLayer)))
)
(gimp-context-push)
(gimp-image-undo-group-start img)
; set up progress bar
(gimp-progress-set-text _"Shuffling Tiles")
;fill list
(while (< counter (* xTiles yTiles))
(begin
(aset tilelist counter counter)
(set! counter (+ counter 1))
)
)
;shuffle list
(while (> counter 1)
(begin
(set! swap (rand counter))
(set! counter (- counter 1))
(set! temp (vector-ref tilelist counter))
(aset tilelist counter (vector-ref tilelist swap))
(aset tilelist swap temp)
)
)
;create a working layer
(set! newlayer (car (gimp-layer-new-from-drawable inLayer img)))
(gimp-image-add-layer img newlayer (car (gimp-image-get-layer-position img inLayer)))
(gimp-layer-set-mode newlayer NORMAL-MODE)
;cut and paste tiles based on the shuffled array
(set! counter 0)
(while (< counter (* xTiles yTiles) )
(begin
(gimp-progress-update (/ counter (+ (* xTiles yTiles) (if (> (remainder width inX) 0) yTiles 0) (if (> (remainder height inY) 0) xTiles 0) ))) ;update progress bar
(set! x0 (* (* (remainder counter xTiles)) inX))
(set! y0 (* (trunc (/ counter xTiles)) inY))
(set! x1 (* (* (remainder (vector-ref tilelist counter) xTiles)) inX))
(set! y1 (* (trunc (/ (vector-ref tilelist counter) xTiles)) inY))
(gimp-rect-select img x0 y0 inX inY CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy inLayer)
(set! tile1 (car (gimp-edit-paste newlayer FALSE)))
(set! tile1 (car (gimp-drawable-transform-2d-default tile1 x0 y0 1 1 0 x1 y1 FALSE 0)))
(set! counter (+ counter 1))
)
)
(gimp-floating-sel-anchor tile1)
;edge tiles
(if (> (remainder width inX) 0)
(begin
(set! tilelist (cons-array yTiles 'double))
(set! counter 0)
;fill list
(while (< counter yTiles)
(begin
(aset tilelist counter counter)
(set! counter (+ counter 1))
)
)
;shuffle list
(while (> counter 1)
(begin
(set! swap (rand counter))
(set! counter (- counter 1))
(set! temp (vector-ref tilelist counter))
(aset tilelist counter (vector-ref tilelist swap))
(aset tilelist swap temp)
)
)
;vertical edge
(set! x0 (* xTiles inX))
(set! x1 (* xTiles inX))
;cut and paste tiles based on the shuffled array
(set! counter 0)
(while (< counter yTiles)
(begin
(gimp-progress-update (/ (+ counter (* xTiles yTiles)) (+ (* xTiles yTiles) (if (> (remainder width inX) 0) yTiles 0) (if (> (remainder height inY) 0) xTiles 0)))) ;update progress bar
(set! y0 (* counter inY))
(set! y1 (* (vector-ref tilelist counter) inY))
(gimp-rect-select img x0 y0 (remainder width inX) inY CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy inLayer)
(set! tile1 (car (gimp-edit-paste newlayer FALSE)))
(set! tile1 (car (gimp-drawable-transform-2d-default tile1 x0 y0 1 1 0 x1 y1 FALSE 0)))
(set! counter (+ counter 1))
)
)
(gimp-floating-sel-anchor tile1)
)
)
;edge tiles
(if (> (remainder height inY) 0)
(begin
(set! tilelist (cons-array xTiles 'double))
(set! counter 0)
;fill list
(while (< counter xTiles)
(begin
(aset tilelist counter counter)
(set! counter (+ counter 1))
)
)
;shuffle list
(while (> counter 1)
(begin
(set! swap (rand counter))
(set! counter (- counter 1))
(set! temp (vector-ref tilelist counter))
(aset tilelist counter (vector-ref tilelist swap))
(aset tilelist swap temp)
)
)
;horizontal edge
(set! y0 (* yTiles inY))
(set! y1 (* yTiles inY))
;cut and paste tiles based on the shuffled array
(set! counter 0)
(while (< counter xTiles)
(begin
(gimp-progress-update (/ (+ counter (* xTiles yTiles) xTiles) (+ (* xTiles yTiles) (if (> (remainder width inX) 0) yTiles 0) (if (> (remainder height inY) 0) xTiles 0)))) ;update progress bar
(set! x0 (* counter inX))
(set! x1 (* (vector-ref tilelist counter) inX))
(gimp-rect-select img x0 y0 inX (remainder height inY) CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy inLayer)
(set! tile1 (car (gimp-edit-paste newlayer FALSE)))
(set! tile1 (car (gimp-drawable-transform-2d-default tile1 x0 y0 1 1 0 x1 y1 FALSE 0)))
(set! counter (+ counter 1))
)
)
(gimp-floating-sel-anchor tile1)
)
)
(set! inLayer (car (gimp-image-merge-down img newlayer EXPAND-AS-NECESSARY)))
(gimp-layer-set-mode inLayer mode)
(gimp-progress-end)
(gimp-image-undo-group-end img)
(gimp-displays-flush)
(gimp-context-pop)
)
)
(script-fu-register "script-fu-tile_shuffle"
"<Image>/Filters/Distorts/_Tile Shuffle..."
"Shuffles image tiles"
"Rob Antonishen"
"Rob Antonishen"
"Jan 2009"
"RGB* GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT "Tile X Size" (list 100 4 1000 1 10 0 SF-SLIDER)
SF-ADJUSTMENT "Tile Y Size" (list 100 4 1000 1 10 0 SF-SLIDER)
)