#!/usr/bin/python # -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # Script to randomly mix cells of a rectangular selection. # Copyright (c) 2009 Perjéssy Lóránt # lostlont@freemail.hu #------------------------------------------------------------------------------- # 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 3 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #------------------------------------------------------------------------------- # Version 1.0 # # Developed and tested on: # - openSUSE 11.1 (x86-64) # - GIMP 2.6.2 # - Python 2.6 # # Also tested on: # - Slackware 12.1.0 # - GIMP 2.4.5 # - Python 2.5.2 import random from gimpfu import * #------------------------------------------------------------------------------- def mix_cells(image, layer, cols, rows, new_layer): #------------------------------------------------------------------------------- # 1. We must have a selection. if pdb.gimp_selection_is_empty(image): gimp.message('There is no selection on the image; please create a selection before running the plugin.') return False # 2. Start undo group. pdb.gimp_image_undo_group_start(image) # 3. New layer. new = layer.copy(True) new.name = layer.name + " [mixed]" image.add_layer(new, 0) # 4. Rectangulate, resize and save selection. s, x, y, r, b = pdb.gimp_selection_bounds(image) w = r - x h = b - y w -= w % cols h -= h % rows pdb.gimp_rect_select(image, x, y, w, h, CHANNEL_OP_REPLACE, False, 0) sel = pdb.gimp_selection_save(image) # 5. Clear selection. pdb.gimp_edit_clear(new_layer and new or layer) # 6. Create array of cell indices. cell_count = cols * rows cells = range(cell_count) random.shuffle(cells) cell_w = w / cols cell_h = h / rows # 7. Copy cells one by one. for i in range(cell_count): j = cells[i] old_col = i % cols # Original cell column index. old_row = i / cols # Original cell row index. new_col = j % cols # Translated cell column index. new_row = j / cols # Translated cell row index. old_x = x + old_col * cell_w # Original cell x position. old_y = y + old_row * cell_h # Original cell y position. new_x = x + new_col * cell_w # Translated cell x position. new_y = y + new_row * cell_h # Translated cell y position. # 7.a Select original cell. pdb.gimp_rect_select( image, old_x, old_y, cell_w, cell_h, CHANNEL_OP_REPLACE, False, 0) # 7.b Copy cell. pdb.gimp_edit_named_copy(new_layer and layer or new, "mix_cell") # 7.c Paste cell as floating selection. pasted = pdb.gimp_edit_named_paste(new_layer and new or layer, "mix_cell", False) # 7.d Translate cell to new position. pasted.set_offsets(new_x, new_y) # 7.e Anchor floating selection. pdb.gimp_floating_sel_anchor(pasted) # 7.f Delete cell buffer. pdb.gimp_buffer_delete("mix_cell") j += 1 if not new_layer: image.remove_layer(new) # 8. Reload selection and finish undo group. pdb.gimp_selection_load(sel) pdb.gimp_image_undo_group_end(image) #------------------------------------------------------------------------------- register( "python_fu_mix_cells", "Randomly mix cells of a rectangular selection", "Randomly mix a table consisting of the specified columns and rows of the selection.", "Perjéssy Lóránt", "(c) 2009 Perjéssy Lóránt", "2009", "/Python-Fu/Mix cells", "", [ (PF_SPINNER, "cols", "Columns", 3, (1, 100, 1)), (PF_SPINNER, "rows", "Rows", 3, (1, 100, 1)), (PF_TOGGLE, "new_layer", "Create on new layer", True) ], [], mix_cells) #------------------------------------------------------------------------------- main()