gimp r25903 - in branches/soc-2008-python: . plug-ins/pygimp



Author: larsc
Date: Mon Jun  9 17:26:55 2008
New Revision: 25903
URL: http://svn.gnome.org/viewvc/gimp?rev=25903&view=rev

Log:
2008-06-09  Lars-Peter Clausen <lars metafoo de>

	* plug-ins/pygimp/__init.py__: Added wrapper for gradients
	* plug-ins/pygimp/context.py: Added context submodule which provides a
	  wrapper around all gimp_context_[get|set]* functions.

Added:
   branches/soc-2008-python/plug-ins/pygimp/context.py
Modified:
   branches/soc-2008-python/ChangeLog
   branches/soc-2008-python/plug-ins/pygimp/__init__.py

Modified: branches/soc-2008-python/plug-ins/pygimp/__init__.py
==============================================================================
--- branches/soc-2008-python/plug-ins/pygimp/__init__.py	(original)
+++ branches/soc-2008-python/plug-ins/pygimp/__init__.py	Mon Jun  9 17:26:55 2008
@@ -31,6 +31,11 @@
 except:
     pass
 
+
+def _prop(func):
+    """Helper function for creating properties"""
+    return property(doc=func.__doc__, *func())
+
 class GimpNamedObject(object):
     """
     GimpNamedObject is a bases class for wrappers around gimp objetcs.
@@ -344,3 +349,264 @@
                     doc="""Name of the entry.""")
     color = property(fget=lambda self:self.__color, fset=__set_color,
                      doc="""Color of the entry.""")
+
+class Gradient(GimpNamedObject):
+    """A gimp Gradient object."""
+
+    __metaclass__ = GimpNamedObjectMeta("gimp_gradient_rename",
+                                        "gimp_gradient_delete",
+                                        "gimp_gradient_duplicate")
+
+    def __init__(self, name):
+        """Creates a new Gradient.
+          name - The name for the gradient"""
+        GimpNamedObject.__init__(self, pdb.gimp_gradient_new(name))
+
+
+    def get_custom_samples(self, positions, reverse=False):
+        """Samples the gradient in custom positions.
+           Returns a list of samples as gimp.color.RGB
+           positions - A list of positions to sample along the gradient.
+           reverse - Whether to use the reverse gradient or not."""
+
+        samples = pdb.gimp_gradient_get_custom_samples(self, len(positions),
+                                                    positions, reverse)[1]
+        return map(color.RGB, *(iter(samples),)*4)
+
+    def get_uniform_samples(self, num_samples, reverse=False):
+        """Samples the specfied uniform parts.
+           Returns a list of samples as gimp.color.RGB.
+           num_samples - Number of samples to return. 2 <= num_samples.
+           reverse - Whether to use the reverse gradient or not."""
+           
+        samples = pdb.gimp_gradient_get_uniform_samples(self, num_samples,
+                                                        reverse)[1]
+        return map(color.RGB,*(iter(samples),)*4)
+
+    segments = property(
+        fget=lambda self: GradientSegmentRange(self, 0, 
+                               pdb.gimp_gradient_get_number_of_segments(self)),
+        fdel=lambda self:pdb.gimp_gradient_segment_range_delete(self, 0, -1),
+        doc="""A gimp.GradientSegmentRange used to access the segemnts of the
+               gradient.""")
+    editable = property(
+        fget=lambda self: pdb.gimp_gradient_is_editable(self) == 1,
+        doc="""True if the segment is editable, otherwise False.""")
+
+class GradientSegment(object):
+
+    def __init__(self, gradient, index):
+        self.gradient = gradient
+        self.index = index
+
+    def __repr__(self):
+        return "<gimp.GradientSegment (%s, %d)>" % (str(self.gradient),
+                                                   self.index)
+    @_prop
+    def blending_function():
+        """The segments blending function.
+           A enum value of gimp.enums.GimpGradientSegmentType."""
+        def get(self):
+            return enums.GimpGradientSegmentType(
+                   pdb.gimp_gradient_segment_get_blending_function(
+                                                    self.gradient, self.index))
+        def set(self, value):
+            pdb.gimp_gradient_segment_range_set_blending_function(self.gradient,
+                                            self.index, self.index, value)
+        return (get,set)
+    
+    @_prop
+    def coloring_type():
+        """The segments coloring type.
+           A enum value of gimp.enums.GimpGradientSegmentColor"""
+        def get(self):
+            return enums.GimpGradientSegmentColor(
+                   pdb.gimp_gradient_segment_get_coloring_type(self.gradient,
+                                                               self.index))
+        def set(self, value):
+            pdb.gimp_gradient_segment_range_set_coloring_type(self.gradient,
+                                                 self.index, self.index, value)
+        return (get,set)
+    
+    def get_left_color(self):
+        return pdb.gimp_gradient_segment_get_left_color(self.gradient,
+                                                        self.index)[0]
+    def set_left_color(self, color):
+        # Get opacity from color
+        if hasattr(color, "a"):
+           opacity = color.a
+        elif len(color) < 4:
+            opacity = 100
+        elif isinstance(color[3], float):
+            opacity = int(color[3] * 100)
+        else:
+            opacity = int(int(color[3]) / 2.55)
+        opacity = min(max(opacity, 0), 100)
+        pdb.gimp_gradient_segment_set_left_color(self.gradient, self.index,
+                                                 color, opacity)
+    def get_right_color(self):
+        return pdb.gimp_gradient_segment_get_right_color(self.gradient,
+                                                        self.index)[0]
+    def set_right_color(self, color):
+        # Get opacity from color
+        if hasattr(color, "a"):
+           opacity = color.a
+        elif len(color) < 4:
+            opacity = 100
+        elif isinstance(color[3], float):
+            opacity = int(color[3] * 100)
+        else:
+            opacity = int(int(color[3]) / 2.55)
+        opacity = min(max(opacity, 0), 100)
+        pdb.gimp_gradient_segment_set_right_color(self.gradient, self.index,
+                                                  color, opacity)
+    @_prop
+    def left_pos():
+        """The left endpoint position of the segment."""
+        def get(self):
+            return pdb.gimp_gradient_segment_get_left_pos(self.gradient,
+                                                          self.index)
+        def set(self, value):
+            pdb.gimp_gradient_segment_set_left_pos(self.gradient, self.index,
+                                                   min(max(value), 0.0, 1.0))
+        return (get, set)
+
+    @_prop
+    def middle_pos():
+        """The middle point position of the segment."""
+        def get(self):
+            return pdb.gimp_gradient_segment_get_middle_pos(self.gradient,
+                                                            self.index)
+        def set(self, value):
+            pdb.gimp_gradient_segment_set_middle_pos(self.gradient, self.index,
+                                                     min(max(value, 0.0), 1.0))
+        return (get, set)
+
+    @_prop
+    def right_pos():
+        """The right endpoint position of the segment."""
+        def get(self):
+            return pdb.gimp_gradient_segment_get_right_pos(self.gradient,
+                                                           self.index)
+        def set(self, value):
+            pdb.gimp_gradient_segment_set_right_pos(self.gradient, self.index,
+                                                    min(max(value, 0.0), 1.0))
+        return (get, set)
+
+
+class GradientSegmentRange(object):
+    
+    def __init__(self, gradient, start, end):
+        self.gradient = gradient
+        self.start = start
+        self.end = end
+
+    def __repr__(self):
+        return "<gimp.GradientSegmentRange (%s, %d, %d)>"% (str(self.gradient),
+                                                          self.start, self.end)
+    
+    def __len__(self):
+        return self.end - self.start
+
+    def __getitem__(self, key):
+        if isinstance(key, slice):
+            start, end, step = key.indices(len(self))
+            if step != 1:
+                raise IndexError
+            if start > end:
+                start = end
+            return GradientSegmentRange(self.gradient, start+self.start,
+                                        end+self.start)
+        elif isinstance(key, int):
+            if key < 0:
+                key += len(self)
+            if key < 0 or key >= len(self):
+                raise IndexError("index out of range")
+
+            return GradientSegment(self.gradient, self.start + key)
+        else:
+            raise TypeError
+
+    def __delitem__(self, key):
+        if isinstance(key, slice):
+            start, end, step = key.indices(len(self))
+            if step != 1:
+                raise IndexError
+            if start > end:
+                start = end
+        elif isinstance(key, int):
+            if key < 0:
+                key += len(self)
+            if key < 0 or key >= len(self):
+                raise IndexError("index out of range")
+            start = key
+            end = start + 1
+        else:
+            raise TypeError
+
+        pdb.gimp_gradient_segment_range_delete(self.gradient,
+                                      self.start + start, self.start + end - 1)
+
+    def blend_colors(self):
+        """Blends the colors (but not the opacity) of the segment range. Using
+           it, the colors' transition will be uniform across the range."""
+        return pdb.gimp_gradient_segment_range_blend_colors(self.gradient,
+                                                          self.start, self.end)
+
+    def blend_opacity(self):
+        """Blends the opacity (but not the colors) of the segment range. Using
+           it, the opacity's transition will be uniform across the range."""
+        return pdb.gimp_gradient_segment_range_blend_opacity(self.gradient,
+                                                          self.start, self.end)
+
+    def flip(self):
+        """Flips the segment range."""
+        return pdb.gimp_gradient_segment_range_flip(self.gradient, self.start,
+                                                    self.end)
+
+    def move(self, offset, compress_neighbors = True):
+        """Move the position of an entire segment range.
+           offset - The offset to move the segment range (-1 <= delta <= 1)
+           compress_neighbores - Whether or not to compress the neighboring
+           segments."""
+        return pdb.gimp_gradient_segment_range_move(self.gradient, self.start,
+                                          self.end, offset, compress_neighbors)
+
+    def redistribute_handles(self):
+        """Uniformly redistribute the segment range's handles."""
+        return pdb.gimp_gradient_segment_range_redistribute_handles(
+                                           self.gradient, self.start, self.end)
+
+    def replicate(self, num_replications):
+        """Replicates the segment range.
+           num_replications - The number of replications (2 <= num_replications
+           <= 20)"""
+        return pdb.gimp_gradient_segment_range_replicate(self.gradient,
+                                        self.start, self.end, num_replications)
+
+    def set_blending_function(self, blending_function):
+        """Sets the blending function for each segment in the segment range.
+           blending_function - A enum value of 
+           gimp.enums.GimpGradientSegmentType."""
+        return pdb.gimp_gradient_segment_range_set_blending_function(
+                        self.gradient, self.start, self.end, blending_function)
+
+    def set_coloring_type(self, coloring_type):
+        """Sets the coloring type for each segment in the segment range.
+           coloring_type - A enum value of gimp.enums.GimpGradientSegmentColor.
+           """
+        return pdb.gimp_gradient_segment_range_set_coloring_type(self.gradient,
+                                           self.start, self.end, coloring_type)
+
+    def split_midpoint(self):
+        """Splits each segment in the segment range at the segment midpoint."""
+        return pdb.gimp_gradient_segment_range_split_midpoint(self.gradient,
+                                                          self.start, self.end)
+
+    def split_uniform(self, num_splits = 1):
+        """Splits each segment in the segment range uniformly.
+           num_splits - Number of splits per segment."""
+        return pdb.gimp_gradient_segment_range_split_uniform(self.gradient,
+                                              self.start, self.end, num_splits)
+
+

Added: branches/soc-2008-python/plug-ins/pygimp/context.py
==============================================================================
--- (empty file)
+++ branches/soc-2008-python/plug-ins/pygimp/context.py	Mon Jun  9 17:26:55 2008
@@ -0,0 +1,210 @@
+# *- Mode: Python; py-indent-offset: 4 -*-
+# Gimp-Python - allows the writing of Gimp plugins in Python.
+# Copyright (C) 2008 Lars-Peter Clausen <lars metafoo de>
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+"""
+This module provides functions for retriving and manipulating the status of the
+current GIMP context.
+"""
+
+from gimp import pdb as _pdb
+
+def get_background():
+    """
+    Returns the current background color. The background color is used in a
+    variety of tools such as blending, erasing (with non-alpha images), and
+    image filling.
+    """
+    return _pdb.gimp_context_get_background()
+
+def get_brush():
+    """
+    Returns a gimp.Brush instance for the active brush. All paint operations
+    and stroke operations use this brush to control the application of paint to
+    the image.
+    """
+    from gimp import Brush
+    return Brush._id2obj(_pdb.gimp_context_get_brush())
+
+def get_font():
+    """
+    Returns a sting containing the name of the active font.
+    """
+    return _pdb.gimp_context_get_font()
+
+def get_foreground():
+    """
+    Returns the current foreground color. The foregroung color is used in a
+    variety of tools such as paint tools, blending, and bucket fill.
+    """
+    return _pdb.gimp_context_get_foreground()
+
+def get_gradient():
+    """
+    Returns a gimp.Gradient instance for the active gradient.
+    """
+    from gimp import Gradient
+    return Gradient._id2obj(_pdb.gimp_context_get_gradient())
+
+def get_opacity():
+    """
+    Returns the opacity setting. The return value is a floating
+    point number between 0 and 100.
+    """
+    return _pdb.gimp_context_get_opacity()
+
+def get_paint_method():
+    """
+    Returns the name of the active paint method.
+    """
+    return _pdb.gimp_context_get_paint_method()
+
+def get_paint_mode():
+    """
+    Returns a enum value of gimp.enums.GimpLayerModeEffects for the active paint
+    mode.
+    """
+    from gimp.enums import GimpLayerModeEffects
+    return GimpLayerModeEffects(_pdb.gimp_context_get_paint_mode())
+
+def get_palette():
+    """
+    Returns a gimp.Palette instance for the active Palette.
+    """
+    from gimp import Palette
+    return Palette._id2obj(_pdb.gimp_context_get_palette())
+
+def get_pattern():
+    """
+    Returns a gimp.Pattern instance for the active Pattern.
+    """
+    from gimp import Pattern
+    return Pattern._id2obj(_pdb.gimp_context_get_pattern())
+
+def list_paint_methods():
+    """
+    Returns a tuple of available paint methods. Any of those can be used for
+    'set_paint_method'.
+    """
+    return _pdb.gimp_context_list_paint_methods()[1]
+
+def pop():
+    """
+    Removes the topmost context from the plug-in's context stack. The context
+    that was active before the corresponding call to 'push' becomes the new
+    current context of the plug-in.
+    """
+    return _pdb.gimp_context_pop()
+
+def push():
+    """
+    Creates a new context by copying the current context. This copy becomes the
+    new context for the calling plug-in until it is popped again using 'pop'.
+    """
+    return _pdb.gimp_context_push()
+
+def set_background(color):
+    """
+    Sets the current background color. The background color is used in a
+    variety of tools suchs as blending, erasing (with non-alpha images), and
+    image filling.
+    color - A valid color instance ot a 3-tuple containing RGB values.
+    """
+    _pdb.gimp_context_set_background(color)
+
+def set_brush(brush):
+    """
+    Sets the active brush.
+    brush - Either a instance of gimp.Brush or a string containing the name of
+    a valid brush.
+    """
+    _pdb.gimp_context_set_brush(brush)
+
+def set_default_colors():
+    """
+    Sets the foreground and background colors to black and white.
+    """
+    _pdb.gimp_context_set_default_colors()
+
+def set_font(font):
+    """
+    Sets the active font.
+    font - A String containing the name of a valid font.
+    """
+    _pdb.gimp_context_set_font(font)
+
+def set_foreground(color):
+    """
+    Sets the active foreground color.
+    color - A valid color instance or a 3-tuple containg RGB values.
+    """
+    _pdb.gimp_context_set_foreground(color)
+
+def set_gradient(gradient):
+    """
+    Sets the active gradient.
+    gradient - Either a instance of gimp.Gradient or a string containing the name
+    of a valid gradient.
+    """
+    _pdb.gimp_context_set_gradient(gradient)
+
+def set_opacity(opacity):
+    """
+    Changes the opacity setting.
+    opacity - A floating point value between 0.0 and 100.0.
+    """
+    _pdb.gimp_context_set_opacity(opacity)
+
+def set_paint_method(paint_method):
+    """
+    Sets active paint method.
+    paint_method - The name of a valid painnt method. For valid values see
+    'list_paint_methods'.
+    """
+    _pdb.gimp_context_set_paint_method(paint_method)
+
+def set_paint_mode(paint_mode):
+    """
+    Sets active paint mode.
+    paint_mode - A enum value of gimp.enums.GimpLayerModeEffects.
+    """
+    _pdb.gimp_context_set_paint_mode(paint_mode)
+
+def set_palette(palette):
+    """
+    Sets the active palette.
+    palette - Either a instance of gimp.Palette or a string containing the name
+    of a valid gradient.
+    """
+    _pdb.gimp_context_set_palette(palette)
+
+def set_pattern(pattern):
+    """
+    Sets the active pattern.
+    pattern - Either a instance of gimp.Pattern or a string containing the name
+    of a valid pattern.
+    """
+    _pdb.gimp_context_set_pattern(pattern)
+
+def swap_colors():
+    """
+    Swaps the current foreground and background colors, so that the new
+    foreground color becomes the old background color and vice versa.
+    """
+    _pdb.gimp_context_swap_colors()
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]