summaryrefslogtreecommitdiff
path: root/doc/reference/patterns.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/reference/patterns.rst')
-rw-r--r--doc/reference/patterns.rst286
1 files changed, 286 insertions, 0 deletions
diff --git a/doc/reference/patterns.rst b/doc/reference/patterns.rst
new file mode 100644
index 0000000..9fab1d2
--- /dev/null
+++ b/doc/reference/patterns.rst
@@ -0,0 +1,286 @@
+.. _patterns:
+
+********
+Patterns
+********
+
+.. currentmodule:: cairo
+
+
+Patterns are the paint with which cairo draws. The primary use of patterns is
+as the source for all cairo drawing operations, although they can also be used
+as masks, that is, as the brush too.
+
+A cairo *Pattern* is created by using one of the *PatternType* constructors
+listed below, or implicitly through *Context.set_source_<type>()* methods.
+
+
+class Pattern()
+===============
+
+*Pattern* is the abstract base class from which all the other pattern classes
+derive. It cannot be instantiated directly.
+
+.. class:: Pattern()
+
+ .. method:: get_extend()
+
+ :returns: the current extend strategy used for drawing the *Pattern*.
+ :rtype: int
+
+ Gets the current extend mode for the *Pattern*. See
+ :ref:`EXTEND attributes <constants_EXTEND>`
+ for details on the semantics of each extend strategy.
+
+ .. method:: get_matrix()
+
+ :returns: a new :class:`Matrix` which stores a copy of the *Pattern's* transformation matrix
+
+ .. method:: set_extend(extend)
+
+ :param extend: an :ref:`EXTEND <constants_EXTEND>` describing how the
+ area outside of the *Pattern* will be drawn
+
+ Sets the mode to be used for drawing outside the area of a *Pattern*.
+
+ The default extend mode is :data:`cairo.EXTEND_NONE` for
+ :class:`SurfacePattern` and :data:`cairo.EXTEND_PAD` for
+ :class:`Gradient` Patterns.
+
+ .. method:: set_matrix(matrix)
+
+ :param matrix: a :class:`Matrix`
+
+ Sets the *Pattern's* transformation matrix to *matrix*. This matrix is a
+ transformation from user space to pattern space.
+
+ When a *Pattern* is first created it always has the identity matrix for
+ its transformation matrix, which means that pattern space is initially
+ identical to user space.
+
+ Important: Please note that the direction of this transformation matrix
+ is from user space to pattern space. This means that if you imagine the
+ flow from a *Pattern* to user space (and on to device space), then
+ coordinates in that flow will be transformed by the inverse of the
+ *Pattern* matrix.
+
+ For example, if you want to make a *Pattern* appear twice as large as it
+ does by default the correct code to use is::
+
+ matrix = cairo.Matrix(xx=0.5,yy=0.5)
+ pattern.set_matrix(matrix)
+
+ Meanwhile, using values of 2.0 rather than 0.5 in the code above would
+ cause the *Pattern* to appear at half of its default size.
+
+ Also, please note the discussion of the user-space locking semantics of
+ :class:`Context.set_source`.
+
+
+class SolidPattern(:class:`Pattern`)
+====================================
+
+.. class:: SolidPattern(red, green, blue, alpha=1.0)
+
+ :param red: red component of the color
+ :type red: float
+ :param green: green component of the color
+ :type green: float
+ :param blue: blue component of the color
+ :type blue: float
+ :param alpha: alpha component of the color
+ :type alpha: float
+ :returns: a new *SolidPattern*
+ :raises: *MemoryError* in case of no memory
+
+ Creates a new *SolidPattern* corresponding to a translucent color. The
+ color components are floating point numbers in the range 0 to 1. If the
+ values passed in are outside that range, they will be clamped.
+
+
+ .. method:: get_rgba()
+
+ :returns: (red, green, blue, alpha) a tuple of float
+
+ Gets the solid color for a *SolidPattern*.
+
+ .. versionadded:: 1.4
+
+
+class SurfacePattern(:class:`Pattern`)
+======================================
+
+.. class:: SurfacePattern(surface)
+
+ :param surface: a cairo :class:`Surface`
+ :returns: a newly created *SurfacePattern* for the given surface.
+ :raises: *MemoryError* in case of no memory.
+
+ .. method:: get_filter()
+
+ :returns: the current :ref:`FILTER <constants_filter>` used for
+ resizing the *SurfacePattern*.
+
+ .. method:: get_surface()
+
+ :returns: the :class:`Surface` of the *SurfacePattern*.
+
+ .. versionadded:: 1.4
+
+ .. method:: set_filter(filter)
+
+ :param filter: a :ref:`FILTER <constants_filter>` describing the filter
+ to use for resizing the *Pattern*
+
+ Note that you might want to control filtering even when you do not have
+ an explicit *Pattern* object, (for example when using
+ :meth:`Context.set_source_surface`). In these cases, it is convenient to use
+ :meth:`Context.get_source` to get access to the pattern that cairo creates
+ implicitly. For example::
+
+ context.set_source_surface(image, x, y)
+ surfacepattern.set_filter(context.get_source(), cairo.FILTER_NEAREST)
+
+
+class Gradient(:class:`Pattern`)
+================================
+
+*Gradient* is an abstract base class from which other *Pattern* classes
+derive. It cannot be instantiated directly.
+
+.. class:: Gradient()
+
+ .. method:: add_color_stop_rgb(offset, red, green, blue)
+
+ :param offset: an offset in the range [0.0 .. 1.0]
+ :type offset: float
+ :param red: red component of color
+ :type red: float
+ :param green: green component of color
+ :type green: float
+ :param blue: blue component of color
+ :type blue: float
+
+ Adds an opaque color stop to a *Gradient* pattern. The offset specifies
+ the location along the gradient's control vector. For example, a
+ *LinearGradient's* control vector is from (x0,y0) to (x1,y1) while a
+ *RadialGradient's* control vector is from any point on the start circle
+ to the corresponding point on the end circle.
+
+ The color is specified in the same way as in :meth:`Context.set_source_rgb`.
+
+ If two (or more) stops are specified with identical offset values, they
+ will be sorted according to the order in which the stops are added,
+ (stops added earlier will compare less than stops added later). This can
+ be useful for reliably making sharp color transitions instead of the
+ typical blend.
+
+ .. method:: add_color_stop_rgba(offset, red, green, blue, alpha)
+
+ :param offset: an offset in the range [0.0 .. 1.0]
+ :type offset: float
+ :param red: red component of color
+ :type red: float
+ :param green: green component of color
+ :type green: float
+ :param blue: blue component of color
+ :type blue: float
+ :param alpha: alpha component of color
+ :type alpha: float
+
+ Adds an opaque color stop to a *Gradient* pattern. The offset specifies
+ the location along the gradient's control vector. For example, a
+ *LinearGradient's* control vector is from (x0,y0) to (x1,y1) while a
+ *RadialGradient's* control vector is from any point on the start circle
+ to the corresponding point on the end circle.
+
+ The color is specified in the same way as in :meth:`Context.set_source_rgb`.
+
+ If two (or more) stops are specified with identical offset values, they
+ will be sorted according to the order in which the stops are added,
+ (stops added earlier will compare less than stops added later). This can
+ be useful for reliably making sharp color transitions instead of the
+ typical blend.
+
+
+class LinearGradient(:class:`Gradient`)
+=======================================
+.. class:: LinearGradient(x0, y0, x1, y1)
+
+ :param x0: x coordinate of the start point
+ :type x0: float
+ :param y0: y coordinate of the start point
+ :type y0: float
+ :param x1: x coordinate of the end point
+ :type x1: float
+ :param y1: y coordinate of the end point
+ :type y1: float
+ :returns: a new *LinearGradient*
+ :raises: *MemoryError* in case of no memory
+
+ Create a new *LinearGradient* along the line defined by (x0, y0) and (x1,
+ y1). Before using the *Gradient* pattern, a number of color stops should
+ be defined using :meth:`Gradient.add_color_stop_rgb` or
+ :meth:`Gradient.add_color_stop_rgba`
+
+ Note: The coordinates here are in pattern space. For a new *Pattern*,
+ pattern space is identical to user space, but the relationship between the
+ spaces can be changed with :meth:`Pattern.set_matrix`
+
+ .. method:: get_linear_points()
+
+ :returns: (x0, y0, x1, y1) - a tuple of float
+
+ * x0: return value for the x coordinate of the first point
+ * y0: return value for the y coordinate of the first point
+ * x1: return value for the x coordinate of the second point
+ * y1: return value for the y coordinate of the second point
+
+ Gets the gradient endpoints for a *LinearGradient*.
+
+ .. versionadded:: 1.4
+
+
+class RadialGradient(:class:`Gradient`)
+=======================================
+.. class:: RadialGradient(cx0, cy0, radius0, cx1, cy1, radius1)
+
+ :param cx0: x coordinate for the center of the start circle
+ :type cx0: float
+ :param cy0: y coordinate for the center of the start circle
+ :type cy0: float
+ :param radius0: radius of the start circle
+ :type radius0: float
+ :param cx1: x coordinate for the center of the end circle
+ :type cx1: float
+ :param cy1: y coordinate for the center of the end circle
+ :type cy1: float
+ :param radius1: radius of the end circle
+ :type radius1: float
+ :returns: the newly created *RadialGradient*
+ :raises: *MemoryError* in case of no memory
+
+ Creates a new *RadialGradient* pattern between the two circles defined by
+ (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the gradient
+ pattern, a number of color stops should be defined using
+ :meth:`Gradient.add_color_stop_rgb` or :meth:`Gradient.add_color_stop_rgba`.
+
+ Note: The coordinates here are in pattern space. For a new pattern, pattern
+ space is identical to user space, but the relationship between the spaces
+ can be changed with :meth:`Pattern.set_matrix`.
+
+ .. method:: get_radial_circles()
+
+ :returns: (x0, y0, r0, x1, y1, r1) - a tuple of float
+
+ * x0: return value for the x coordinate of the center of the first circle
+ * y0: return value for the y coordinate of the center of the first circle
+ * r0: return value for the radius of the first circle
+ * x1: return value for the x coordinate of the center of the second circle
+ * y1: return value for the y coordinate of the center of the second circle
+ * r1: return value for the radius of the second circle
+
+ Gets the *Gradient* endpoint circles for a *RadialGradient*, each
+ specified as a center coordinate and a radius.
+
+ .. versionadded:: 1.4