Giant blob of minor changes
[dotfiles/.git] / .config / GIMP / 2.10 / plug-ins / plugin-resynth-fill-pattern.py
diff --git a/.config/GIMP/2.10/plug-ins/plugin-resynth-fill-pattern.py b/.config/GIMP/2.10/plug-ins/plugin-resynth-fill-pattern.py
new file mode 100755 (executable)
index 0000000..dd89610
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+'''
+Gimp plugin "Fill with pattern seamless..."
+Front end to the resynthesizer plugin to make a seamless fill.
+
+Copyright 2011 lloyd konneker
+Idea by Rob Antonishen
+
+Version:
+1.0 lloyd konneker
+
+During development, remember to make it executable!!!
+And to remove older versions, both .scm and .py that might hide it.
+
+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
+
+'''
+
+from gimpfu import *
+
+gettext.install("resynthesizer", gimp.locale_directory, unicode=True);
+
+debug = False
+
+def layer_from_pattern(image, pattern):
+  '''
+  Create a new image and layer having the same size as a pattern.
+  '''
+  new_basetype = pdb.gimp_image_base_type(image)  # same as source
+  new_layertype = pdb.gimp_drawable_type(pdb.gimp_image_get_active_layer(image))
+  pattern_width, pattern_height, bpp = pdb.gimp_pattern_get_info(pattern)
+  new_image = pdb.gimp_image_new(pattern_width, pattern_height, new_basetype)
+  # !!! Note that gimp_layer_new wants a layer type, not an image basetype
+  new_drawable = pdb.gimp_layer_new(new_image, pattern_width, pattern_height,
+    new_layertype, "Texture", 100, NORMAL_MODE)
+  pdb.gimp_image_add_layer(new_image, new_drawable, 0)
+  return new_image, new_drawable
+  
+  
+def guts(image, drawable, pattern):
+  ''' Crux of algorithm '''
+  
+  # Make drawble from pattern
+  pattern_image, pattern_layer = layer_from_pattern(image, pattern)
+  
+  # Fill it with pattern
+  # NOT pass pattern_layer.ID !!!
+  pdb.gimp_drawable_fill(pattern_layer, PATTERN_FILL)
+  
+  if debug:
+    gimp.Display(pattern_image) 
+    gimp.displays_flush() 
+  
+  # Resynthesize the selection from the pattern without using context
+  # 0,0,0: Not use_border (context), not tile horiz, not tile vert
+  # -1, -1, 0: No maps and no map weight
+  # DO pass pattern_layer.ID !!!
+  # Resynthesizer is an engine, never interactive
+  pdb.plug_in_resynthesizer(image, drawable, 0, 0, 0, pattern_layer.ID, -1, -1, 0, 0.05, 8, 300)
+      
+  # Clean up
+  if not debug:
+    # Delete image that is displayed throws RuntimeError
+    pdb.gimp_image_delete(pattern_image)
+  
+  
+def plugin_main(image, drawable, pattern):
+  '''
+  Main: the usual user-friendly precondition checking, postcondition cleanup.
+  pattern is a string
+  '''  
+  # User_friendly: if no selection, use entire image.
+  # But the resynthesizer does that for us.
+  
+  # Save/restore the context since we change the pattern
+  pdb.gimp_context_push()
+  pdb.gimp_context_set_pattern(pattern)
+  guts(image, drawable, pattern)
+  pdb.gimp_context_pop()
+  
+  gimp.displays_flush()
+
+
+register(
+  "python_fu_fill_pattern_resynth",
+  N_("Seamlessly fill with a pattern using synthesis."),
+  "Requires separate resynthesizer plugin.",
+  "Lloyd Konneker",
+  "Copyright 2011 Lloyd Konneker",
+  "2011",
+  N_("_Fill with pattern seamless..."),
+  "RGB*, GRAY*",
+  [
+    (PF_IMAGE,    "image",    "Input image", None),
+    (PF_DRAWABLE, "drawable", "Input drawable", None),
+    (PF_PATTERN,  "pattern",  _("Pattern:"), 'Maple Leaves')
+  ],
+  [],
+  plugin_main,
+  menu="<Image>/Edit",
+  domain=("resynthesizer", gimp.locale_directory)
+  )
+
+main()